【问题标题】:XNA: Orthographic window resizing without stretchingXNA:正交窗口调整大小而不拉伸
【发布时间】:2013-04-28 16:35:16
【问题描述】:

我从事 Windows 游戏项目已经有一段时间了。我曾经有一个静态的 1600 x 900 分辨率,对我来说效果很好。但对于我的一些 Beta 测试人员来说,情况并非如此。

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

我想知道的是如何计算与泰拉瑞亚使用的相似的投影矩阵。对于那些不知道它在 terraria 中如何工作的人(无论如何,现在我认为它过去有所不同)是,一旦你调整了游戏窗口的大小,你会在屏幕上看到更多的东西。

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

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

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

有没有办法计算投影矩阵,以便我可以在水平和垂直方向调整窗口大小?

编辑:

我正在间接使用相机类。一切都在 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);

【问题讨论】:

  • 为什么不每次调整窗口大小时调用上面的代码?
  • 我在 Window.ClientSizeChanged 事件中这样做,但如上所述,它仅在水平调整窗口大小时有效,而在垂直调整时会严重中断。

标签: c# xna window 2d orthographic


【解决方案1】:

如果在正交投影中包含显示器的分辨率,就可以达到我认为想要的效果。

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

【讨论】:

  • 如果我没记错的话,我已经尝试过了,但是下班回家后我会再次测试并报告结果。
  • 是的,我确实尝试过,它显示了我的整个世界,而不仅仅是相机显示的内容。我将在原始问题中添加有关相机使用情况的提及。
  • 因为正交矩阵的高度与屏幕分辨率无关。它被硬编码为 -25 到 +25。无论窗口有多大,您只能看到相同的 50 个单位的垂直空间。您可以尝试使用当前屏幕高度与所需屏幕高度的比率 * 25。例如在 1080p 你会有 1080/900*25
  • 非常好!我不知道这是否正是您所追求的,但我将解决方案添加到原始问题中。经过一些微调后,我找到了与我想要的值相匹配的值,现在两种调整窗口大小的方式都像我想要的那样工作。谢谢你,我的好先生,也许我今晚会好好睡一觉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2021-11-18
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
相关资源
最近更新 更多