在XNA中缩放整个屏幕

在XNA中缩放整个屏幕,xna,xna-4.0,resolution-independence,Xna,Xna 4.0,Resolution Independence,使用XNA,我正在尝试制作一个冒险游戏引擎,让你制作的游戏看起来像是90年代早期的游戏,比如《触手之日》和《山姆和马克斯上路》。因此,我希望游戏实际运行在320x240(我知道,它可能应该是320x200,但嘘),但它应该根据用户设置进行放大 它现在可以正常工作了,但我遇到了一些问题,我真的希望它看起来像现在这样更加像素化 以下是我现在正在做的: 在游戏初始化中: public Game() { graphics = new GraphicsDeviceManager(t

使用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中,而不是在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);为了使投影看起来不模糊,但它看起来很棒!再次感谢!