在XNA中缩放整个屏幕

Ada*_*ich 9 xna resolution-independence xna-4.0

使用XNA,我正在尝试创建一个冒险游戏引擎,让你制作看起来像90年代初期的游戏,比如触手之日和Sam&Max Hit the Road.因此,我希望游戏实际上以320x240运行(我知道,它应该是320x200,但是嘘),但它应该根据用户设置进行扩展.

它的工作原理样的好现在,但我遇到了一些问题,我其实希望它看起来更加像素化,它目前不会.

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

在游戏初始化中:

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

        Scale = graphics.PreferredBackBufferWidth / 320;
    }
Run Code Online (Sandbox Code Playgroud)

Scale是一个公共静态变量,我可以随时检查以查看相对于320x240我应该扩展多少游戏.

在我的绘图功能:

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone, null, Matrix.CreateScale(Game.Scale));
Run Code Online (Sandbox Code Playgroud)

这样,一切都以320x240绘制并且被炸毁以适应当前分辨率(默认为640x480).当然,我做数学将鼠标的实际坐标转换为320x240坐标,依此类推.

现在,这是伟大的,但现在我已经到了我想要开始缩放我的精灵,让他们走到远处等等的地步.

看下面的图片.左上角的图像是游戏以640x480运行时的截图.它右边的图像是"应该"看的样子,在320x240.最下面的一排图像只是吹到300%的顶行(在Photoshop中,不在引擎中),所以你可以看到我在说什么.

图像显示分辨率变化时缩放的差异

在640x480图像中,您可以看到不同的"线条粗细"; 较粗的线是它应该看起来的样子(一个像素= 2x2,因为它运行在640x480),但是由于缩放,较细的线条(1x1像素)也会出现,当它们不应该时(参见右边的图像) ).

基本上我试图模拟一个320x240的显示器,但是使用XNA会升级到任何分辨率,并且矩阵变换不能解决问题.我有什么办法可以做到这一点吗?

小智 15

将原始分辨率中的所有内容渲染为RenderTarget而不是后台缓冲区:

        SpriteBatch targetBatch = new SpriteBatch(GraphicsDevice);
        RenderTarget2D target = new RenderTarget2D(GraphicsDevice, 320, 240);
        GraphicsDevice.SetRenderTarget(target);

        //perform draw calls
Run Code Online (Sandbox Code Playgroud)

然后将此目标(您的整个屏幕)渲染到后台缓冲区:

        //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();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!我让最后一个SpriteBatch调用了一个:spriteBatch.Begin(SpriteSortMode.Deferred,BlendState.NonPremultiplied,SamplerState.PointClamp,DepthStencilState.Default,RasterizerState.CullNone); 为了使投影看起来不模糊,但它看起来很棒!再次感谢! (2认同)