在XNA中缩放整个屏幕
使用XNA,我正在尝试制作一个冒险游戏引擎,让你制作的游戏看起来像是90年代早期的游戏,比如《触手之日》和《山姆和马克斯上路》。因此,我希望游戏实际运行在320x240(我知道,它可能应该是320x200,但嘘),但它应该根据用户设置进行放大 它现在可以正常工作了,但我遇到了一些问题,我真的希望它看起来像现在这样更加像素化 以下是我现在正在做的: 在游戏初始化中:在XNA中缩放整个屏幕,xna,xna-4.0,resolution-independence,Xna,Xna 4.0,Resolution Independence,使用XNA,我正在尝试制作一个冒险游戏引擎,让你制作的游戏看起来像是90年代早期的游戏,比如《触手之日》和《山姆和马克斯上路》。因此,我希望游戏实际运行在320x240(我知道,它可能应该是320x200,但嘘),但它应该根据用户设置进行放大 它现在可以正常工作了,但我遇到了一些问题,我真的希望它看起来像现在这样更加像素化 以下是我现在正在做的: 在游戏初始化中: public Game() { graphics = new GraphicsDeviceManager(t
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中,而不是在engine中),所以你可以看到我在说什么
在640x480图像中,您可以看到不同的“线厚度”;较粗的线是它的实际外观(一个像素=2x2,因为它以640x480运行),但较细的线(1x1像素)也会出现,当它们不应该出现时,由于缩放(参见右侧的图像)
基本上,我试图模拟一个320x240的显示器,但是使用XNA放大到任何分辨率,矩阵变换并没有起作用。有什么方法可以这样做吗?以本机分辨率将所有内容渲染到渲染目标,而不是后缓冲区:
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();
然后将此目标(整个屏幕)渲染到后缓冲区:
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();
非常感谢!我已经进行了最后一次SpriteBatch调用:SpriteBatch.Begin(SpriteSortMode.Deferred,BlendState.nonpremultipled,samplestate.PointClamp,DepthStencilState.Default,RasterizerState.CullNone);为了使投影看起来不模糊,但它看起来很棒!再次感谢!