使用XNA,我试图创建一个冒险游戏引擎,让你制作看起来像90年代初期的游戏,比如触手之日和山姆&马克思上路。因此,我希望游戏实际上以320x240运行(我知道,它应该是320x200,但是嘘),但它应该根据用户设置进行扩展。
现在它运作良好,但是我遇到了一些问题,我实际上希望它看起来像目前那样更多像素化。
这就是我现在正在做的事情:
在游戏初始化中:
public Game() {
graphics = new GraphicsDeviceManager(this);
graphics.PreferredBackBufferWidth = 640;
graphics.PreferredBackBufferHeight = 480;
graphics.PreferMultiSampling = false;
Scale = graphics.PreferredBackBufferWidth / 320;
}
Scale是一个公共静态变量,我可以随时查看以查看相对于320x240我应该扩展多少游戏。
在我的绘图功能中:
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone, null, Matrix.CreateScale(Game.Scale));
这样,所有内容都以320x240绘制并且被炸毁以适应当前分辨率(默认为640x480)。当然,我做数学将鼠标的实际坐标转换为320x240坐标,依此类推。
现在,这一切都很棒,但现在我已经到了想要开始缩放我的精灵,让它们走到远处等等的地方。
请看下面的图片。左上角的图像是游戏以640x480运行时的截图。它右边的图像是它应该如何"看,在320x240。最下面的一行图像只是吹到300%的最高行(在Photoshop中,而不是引擎内),所以你可以看到我在说什么。
在640x480图像中,您可以看到不同的线条厚度;"较粗的线是它应该看起来的样子(一个像素= 2x2,因为它运行在640x480),但是由于缩放,更细的线(1x1像素)也会出现,当它们不应该时(参见图像上的图像)右边)。
基本上我试图模拟一个320x240的显示器,但是使用XNA将其升级到任何分辨率,而矩阵变换并不是这样做的。我有什么办法可以做到这一点吗?
答案 0 :(得分:15)
将原始分辨率中的所有内容渲染为RenderTarget而不是后台缓冲区:
SpriteBatch targetBatch = new SpriteBatch(GraphicsDevice);
RenderTarget2D target = new RenderTarget2D(GraphicsDevice, 320, 240);
GraphicsDevice.SetRenderTarget(target);
//perform draw calls
然后将此目标(整个屏幕)渲染到后台缓冲区:
//set rendering back to the back buffer
GraphicsDevice.SetRenderTarget(null);
//render target to back buffer
targetBatch.Begin();
targetBatch.Draw(target, new Rectangle(0, 0, GraphicsDevice.DisplayMode.Width, GraphicsDevice.DisplayMode.Height), Color.White);
targetBatch.End();