代码之家  ›  专栏  ›  技术社区  ›  Martijn Courteaux

游戏开发:如何使我的spritegame动态地解决问题?

  •  1
  • Martijn Courteaux  · 技术社区  · 14 年前

    我在写一个XNA游戏。但我想要一个聪明的方式,使游戏的动态不同的决议。对于那些了解谷歌世界的人来说:就像谷歌世界一样。可见面积的大小必须与分辨率无关。所以,如果我设定一个更高的分辨率。我不想看到更多。我只想知道更多细节。当然精灵也有细节。

    举个简单的例子:我有一个64x64的雪碧。当我的决心是:

    • 720p :我想用(例如!) 42x42 .
    • 1080p :必须以64x64的大小绘制。(所以1080p表示雪碧的全尺寸)
    • 480p :必须以32x32的尺寸绘制。

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

    但我不知道怎么做。
    有什么帮助吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Jack    14 年前

    我从未使用过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 否则雪碧就在外面。

        2
  •  1
  •   Community CDub    8 年前

    使用SpriteBatch pass a时 标度矩阵 ( Matrix.CreateScale )到 SpriteBatch.Begin .

    别忘了考虑长宽比( this question 可能值得一读)。

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

    你可能想看看我对这个话题的回答 here (包括回答世界/视图/项目空间如何工作的答案的链接)和 here 可能还有 here here 也。