2

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

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

4

1 回答 1

0

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

也就是说,您可以继续使用 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 上执行计算,甚至通过自定义进行转换线性代数什么的。

于 2012-04-28T01:57:43.413 回答