游戏开发:如何使我的spritegame动态分辨率?

时间:2010-11-24 17:53:24

标签: algorithm graphics xna

我正在写一个XNA游戏。但我希望有一种智能的方式让游戏动态适应不同的分辨率。对于那些了解The World of Goo的人:就像The World of Goo一样。因此,可见区域的数量必须与分辨率无关。所以,如果我设置更高的分辨率。我不想看到更多。我只想要更多细节。当然,精灵确实有细节。

简短示例:我有一个64x64的精灵。我的决议是:

  • 720p:我想用(例如!)42x42的大小绘制它。
  • 1080p:必须使用64x64的大小绘制。 (所以1080p意味着精灵的全尺寸)
  • 480p:必须使用32x32的大小绘制。

因此,每个精灵必须在屏幕上看起来一样,与分辨率无关。

但我不知道该怎么办。
有帮助吗?

2 个答案:

答案 0 :(得分:3)

我从未使用过XNA,但通常只是为了解决这类问题,你需要从屏幕的实际分辨率中抽象出精灵的位置。

这意味着您可以使用绝对坐标存储对象位置(例如,在0.0f - 1.0范围内),以便x = 0.0是最左边的像素可见,1.0是最右边的相同故事, y坐标。

然后根据此坐标空间计算所有内容,并且您担心在实际绘图之前转换它们。当然,对于这种方法,您需要具有不同的大小,必须以独立于分辨率的方式保持相同的比例。

例如,如果您有1080p,那么您选择64x64精灵,1080/64则为16.875,因此对于720p分辨率,您将需要42.6像素(如您选择:42x42),以此类推其他分辨率。

转换非常简单:

float xcord = ...
float ycord = ...

int xscreen = (int)(xcord*xresolution)
int yscreen = (int)(ycord*yresolution)

(我不知道XNA是否已经使用浮点数作为坐标)

另外我实际上不知道你正在制作什么样的游戏,但是如果你的屏幕只显示整个世界/游戏的视口/你可以轻松地将滚动部分与这个转换整合在一起,因为你可以轻松抵消它以获得屏幕坐标:

float xcord = 15.4 /* something absolute to the world*/
int xscreen = (int)((xcord - xviewport_offset) * xresolution)

其中xviewport_offset应该是视口左侧的坐标,当然差异应该是< 1.0,否则精灵会在外面。

答案 1 :(得分:1)

使用SpriteBatch时,将缩放矩阵Matrix.CreateScale)传递给SpriteBatch.Begin

不要忘记考虑宽高比(this question可能值得一读)。

您可以组合缩放和变换矩阵来处理滚动等。

您可能希望阅读关于此主题的here的答案(包括答案​​中的链接,以及有关世界/视图/项目空间如何工作的答案)和here以及可能{{3 }}和here