【问题标题】:XNA - Resolution independent tile-based gameXNA - 分辨率独立的基于瓷砖的游戏
【发布时间】:2012-05-08 10:30:06
【问题描述】:

我开始学习如何使用 XNA 制作简单的基于图块的游戏,但我发现自己遇到了问题。使用 OpenGL,当我定义要绘制的坐标时,例如,一个矩形,这些坐标指的是我创建的视口(正交或透视)。因此,例如,坐标 0,0 的点被放置在屏幕的中心。

使用 XNA,所有尺寸和坐标都以像素表示,所以如果我绘制一个 10x10 的矩形,它将是一个 10 像素 x 10 像素的矩形,原点坐标也是如此。 这样,如果我改变分辨率,比例就会改变(在 OpenGL 中,它们没有,都具有相同的大小)。如何在不受像素比例限制的情况下使用 XNA?谁能告诉我我哪里做错了或者我该怎么做?

【问题讨论】:

标签: c# xna


【解决方案1】:

我假设您正在使用Spritebatch.Draw(Texture2D texture, Vector2 position, Color color) 来绘制代表瓷砖的二维精灵。是的,在这种情况下,“Vector2 位置”确实是窗口空间中的一对坐标。但是在 XNA 中还有许多其他的绘制方法,包括完全按照您在 OpenGL 中所做的操作,即创建多边形并使用世界/视图矩阵对其进行变换。例如,请参阅 MSDN 上的 this tutorial

也就是说,您可以继续使用 Spritebatch 并使用 Spritebatch.Draw(Texture2D texture, Rectangle destinationRectangle, Color color)“手动”执行缩放。假设一个 tile 应始终占据屏幕宽度的 5% 和屏幕高度的 6%,那么缩放将如下所示:

var destinationRectangle = new Rectangle(
    positionX, 
    positionY, 
    0.05 * screenWidth, 
    0.06 * screenHeight);
spritebatch.Draw(tileTexture, destinationRectangle, Color.White);

您可以使用 GraphicsDevice.Viewport.Width/Height 获取屏幕的宽度和高度。

更一般地说,没有什么可以阻止您缩放坐标,但是您认为使用Matrix 类和 Vector2/3.Transform 方法是合适的,无论您是想通过着色器还是在 cpu 上执行计算,甚至是通过自定义线性代数或其他方式进行转换。

【讨论】:

  • 很好的答案。我感觉 OP 正在通过 Reimers XNA 教程学习,这本身并没有那么糟糕,但并没有展示 XNA 的 OO 功能(这可以让这MUCH 更容易)
猜你喜欢
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
相关资源
最近更新 更多