c# - XNA - 分辨率独立的基于图 block 的游戏

标签 c# xna

我开始学习如何使用 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/

相关文章:

c# - EF6 无效的列名 Member_ID

c# - 获取字符串的最后 3 个字符

javascript - Asp.net Webform 中用于多项选择问题的单选按钮

c# - 我无法在另一台计算机上运行已发布的应用程序

c# - XNA WP7 上的广告

XmlElement 的 C# 数组正在添加另一层嵌套

c# - 如何使用 Linq where 语句动态获取另一个属性中的属性值

c# - 如何使用 XNA 加载文件夹中的所有文件?

c# - Box2dx : Specify fixtures to ignore in raycasting?

c# - XNA 的高 CPU 使用率