我正在尝试使用XNA创建一个冒险游戏引擎,使您可以制作看起来像90年代初期淘汰的游戏,例如《触手之日》和《山姆与麦克斯上路》。因此,我希望游戏实际以320x240的速度运行(我知道它可能应该为320x200,但嘘),但它应该根据用户设置进行扩展。

现在它可以正常工作,但是我遇到了一些问题,实际上我想让它看起来像现在这样更加像素化。

这是我现在正在做的事情:

在游戏初始化中:

    public Game() {
        graphics = new GraphicsDeviceManager(this);
        graphics.PreferredBackBufferWidth = 640;
        graphics.PreferredBackBufferHeight = 480;
        graphics.PreferMultiSampling = false;

        Scale = graphics.PreferredBackBufferWidth / 320;
    }

缩放是一个公共(public)静态变量,我可以随时检查以查看相对于320x240的游戏应该缩放多少。

在我的绘图功能中:
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone, null, Matrix.CreateScale(Game.Scale));

这样,所有内容均以320x240绘制并放大以适合当前分辨率(默认为640x480)。当然,我会进行数学运算以将鼠标的实际坐标转换为320x240坐标,依此类推。

现在,这一切都很棒,但是现在我要开始缩放我的 Sprite ,让它们步入远方,以此类推。

看下面的图片。左上方的图像是游戏以640x480运行时的屏幕截图。右边的图片是其“应该”显示的效果,分辨率为320x240。图像的最下面一行只是最上面一行(最多300%)(在Photoshop中,而不是在引擎中),因此您可以看到我在说什么。

在640x480的图像中,您可以看到不同的“线条粗细”。较粗的线实际上是它的外观(一个像素= 2x2,因为它以640x480运行),但是由于比例缩放,较细的线(1x1像素)在不应该显示的情况下也会出现(请参见右侧的图像) )。

基本上,我试图模拟320x240的显示,但是使用XNA使其达到任何分辨率,矩阵转换并不能解决问题。我有什么办法可以做到这一点?

最佳答案

将原始分辨率中的所有内容渲染到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();

关于xna - 在XNA中缩放整个屏幕,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7602852/

10-11 06:33