XNA:不拉伸的正交窗口大小调整

本文关键字:窗口大小 调整 XNA | 更新日期: 2023-09-27 18:11:17

我已经致力于一个Windows游戏项目有一段时间了。我曾经有一个静态的1600 x 900分辨率,这对我来说很好。但对我的一些测试者来说却不是这样。

这让我开始关注基于xna的游戏的分辨率独立性。我已经经历了很多虚拟分辨率系统,在RenderTarget2D上绘制所有内容并拉伸以适应窗口大小。但这对我不起作用。

我想知道的是如何计算一个类似于Terraria使用的投影矩阵。对于那些不知道terraria是如何工作的人(现在我认为它曾经是不同的),一旦你调整游戏窗口的大小,你会在屏幕上看到更多的东西。

目前我的投影矩阵是这样定义的:

            Projection = Matrix.CreateOrthographicOffCenter(-25 * _graphics.Viewport.AspectRatio, 
            25 * _graphics.Viewport.AspectRatio,
            -25, 25,
            -1, 1 );

当窗口的大小水平变化时,此操作有效。我看到更多的东西,一切都很好。但是一旦我垂直调整了窗口的大小,所有的东西都夹在一起了。

是否有一种方法来计算投影矩阵,使它可以让我调整窗口的大小水平和垂直?

编辑:

我间接使用了一个camera类。所有东西都在Farseer Physics坐标空间中,当某些东西被绘制到屏幕上时,它通过Viewport.Unproject()进行转换。

解决方案

:

正如gareththegeek在所选答案的评论部分指出的那样,我所追求的特定投影矩阵是这样形成的:

 Projection = Matrix.CreateOrthographicOffCenter(-(_graphics.Viewport.Width / 1600f * 44),
        (_graphics.Viewport.Width / 1600f * 44),
        -(_graphics.Viewport.Height / 900f * 25), (_graphics.Viewport.Height / 900f * 25),
        -1, 1);

XNA:不拉伸的正交窗口大小调整

如果在正射影投影中包含显示器的分辨率,我认为可以达到预期的效果。

Projection = Matrix.CreateOrthographicOffCenter(
    0.0f, _graphics.Viewport.Width,
    _graphics.Viewport.Height, 0.0f,
    -1.0f, 1.0f);