我已经编写了一个2D跳跃和奔跑引擎,生成了一个320x224(320x240)的图像。为了保持老式的“像素感觉”,我想根据用户的分辨率将生成的图像缩放2倍、3倍或4倍。
我不想缩放每一个精灵,而是缩放生成的图像!
提前感谢您的帮助 :)
Bob's answer正确地指出了将过滤模式更改为TextureFilter.Point
以保持像素化的良好效果。
但是,比缩放每个精灵(您还必须缩放每个精灵的位置)更好的方法可能是只需向SpriteBatch.Begin
传递矩阵,就像这样:
sb.Begin(/* first three parameters */, Matrix.CreateScale(4f));
这将为您提供所需的比例,而无需修改所有绘制调用。
但值得注意的是,如果您在游戏中使用浮点偏移量,则在缩放时会出现未对齐像素边界的情况(使用任何一种方法)。
有两种解决方法。第一种是拥有一个类似于此的函数:
public static Vector2 Floor(Vector2 v)
{
return new Vector2((float)Math.Floor(v.X), (float)Math.Floor(v.Y));
}
TextureFilter.Point
)。GraphicsDevice.SetRenderTarget
。阅读此MSDN文章可能会有所帮助。如果您正在使用或移动到XNA 4.0,则这篇文章可能值得一读。我不太确定你所说的“导致...一张图片”的意思,但如果你的最终结果是一个纹理,那么你可以将其绘制到屏幕上并设置比例:
spriteBatch.Draw(texture, position, source, color, rotation, origin, scale, effects, depth);
只需将比例替换为您想要的任何数字(2、3或4)。我做类似的事情,但是按精灵而不是结果图缩放。如果您指的是其他内容,请告诉我,我会尽力帮助。
XNA默认对缩放图像进行抗锯齿处理。如果您想保留像素化的好处,则需要在立即排序模式下绘制并设置一些附加参数:
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None);
GraphicsDevice.SamplerStates[0].MagFilter = TextureFilter.Point;
GraphicsDevice.SamplerStates[0].MinFilter = TextureFilter.Point;
GraphicsDevice.SamplerStates[0].MipFilter = TextureFilter.Point;
这要么是Point,要么是None TextureFilter。我现在正在工作,所以只能凭记忆回答。稍后我会确认一下。