XNA - 独立于分辨率的基于区块的游戏

时间:2012-04-27 16:40:31

标签: c# xna

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

对于XNA,所有尺寸和坐标都以像素表示,因此如果我绘制一个10x10的矩形,它将是一个10像素x10像素的矩形,并且原点的坐标也是如此。 这样,如果我改变分辨率,比例会改变(在OpenGL中,它们没有,所有都具有相同的大小)。如何在不受像素比例约束的情况下使用XNA?任何人都可以告诉我我在哪里做错了或者我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

也就是说,您可以继续使用Spritebatch并使用Spritebatch.Draw(Texture2D texture, Rectangle destinationRectangle, Color color)“手动”执行缩放。假设一块瓷砖应该总是占据屏幕宽度的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上执行计算,甚至通过自定义线性代数或其他任何方式进行变换。