我开始学习如何使用 XNA 制作简单的基于图 block 的游戏,但我发现自己遇到了问题。使用 OpenGL,当我定义要绘制的坐标时,例如,一个矩形,这些坐标指的是我制作的视口(viewport)(正交或透视)。因此,例如,坐标 0,0 的点位于屏幕的中心。
使用 XNA,所有尺寸和坐标都以像素表示,因此如果我绘制一个 10x10 的矩形,它将是一个 10 像素 x 10 像素的矩形,原点坐标也是如此。 这样,如果我改变分辨率,比例就会改变(在 OpenGL 中,它们没有,都具有相同的大小)。如何在不受像素比例限制的情况下使用 XNA?谁能告诉我哪里做错了或者我该怎么做?
最佳答案
我假设您使用的是 Spritebatch.Draw(Texture2D texture, Vector2 position, Color color)绘制代表图 block 的 2d Sprite 。是的,在这种情况下,“Vector2 位置”确实是窗口空间中的一对坐标。但是还有许多其他方法可以在 XNA 中进行绘制,包括完全按照您在 OpenGL 中所做的那样进行,即创建多边形并使用世界/ View 矩阵对其进行转换。参见例如 this tutorial在 MSDN 上。
就是说,您可以继续使用 Spritebatch 并使用 Spritebatch.Draw(Texture2D texture, Rectangle destinationRectangle, Color color)“手动”执行缩放.假设一个图 block 应始终占据屏幕宽度的 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 上执行计算,甚至是通过自定义线性代数或其他方式进行转换。
关于c# - XNA - 分辨率独立的基于图 block 的游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10354627/