我正在写一个XNA游戏。但我希望有一种智能的方式让游戏动态适应不同的分辨率。对于那些了解The World of Goo的人:就像The World of Goo一样。因此,可见区域的数量必须与分辨率无关。所以,如果我设置更高的分辨率。我不想看到更多。我只想要更多细节。当然,精灵确实有细节。
简短示例:我有一个64x64的精灵。我的决议是:
720p
:我想用(例如!)42x42
的大小绘制它。1080p
:必须使用64x64的大小绘制。 (所以1080p意味着精灵的全尺寸)480p
:必须使用32x32的大小绘制。因此,每个精灵必须在屏幕上看起来一样,与分辨率无关。
但我不知道该怎么办。
有帮助吗?
答案 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。