2013-04-28 72 views
2

我一直在为Windows游戏项目工作了一段时间。我曾经有一个静态的1600 x 900分辨率,对我来说工作得很好。但对于我的一些测试者来说并不是那么重要。XNA:正交窗口调整大小不拉伸

这让我在基于XNA的游戏中寻找分辨率独立性。我经历了很多虚拟分辨率系统,它们绘制RenderTarget2D上的所有内容,并将其扩展为适合窗口大小。但是这对我不起作用。

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

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

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

这工作时,窗口的大小水平变化。我侧身看到更多东西,一切都很好。但是,一旦我垂直调整窗口大小,所有东西都会夹在一起。

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

编辑:

我使用的相机类是间接的。一切都在Farseer物理坐标空间中,当某些东西被绘制到屏幕上时,它通过Viewport.Unproject()转换。

SOLUTION

由于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); 
+0

为什么不在每次窗口重新调整大小时调用上面的代码位呢? – ClassicThunder 2013-04-28 21:50:25

+0

我这样做,在Window.ClientSizeChanged事件中,但如上所述,它仅在水平调整窗口大小时起作用,并且在垂直方向上打开时会严重损坏。 – aRkker 2013-04-29 05:38:29

回答

1

如果包括在正交投影中显示的分辨率可以达到我想的效果。

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

如果我记得正确的话,我已经尝试过了,但是一旦我下班回家,我会再次测试并报告结果。 – aRkker 2013-04-29 12:04:07

+0

的确,我曾尝试过,它显示了我的整个世界,而不仅仅是相机显示的内容。我会在原始问题中增加一个关于相机使用的提及。 – aRkker 2013-04-29 13:50:53

+0

因为正交矩阵的高度与屏幕分辨率无关。它被硬编码为-25到+25。无论窗户有多大,您只能看到相同的50个单位的垂直空间。您可以尝试使用当前屏幕高度与所需屏幕高度的比率* 25。在1080p你将有1080/900 * 25 – gareththegeek 2013-04-29 16:05:37