2

我正在编写一个游戏,其中视口在有限的游戏世界中跟随玩家的船,并且我试图使背景“环绕”在各个方向上(你可以将它想象成一个 2D 表面包裹在一个球体 - 无论您朝哪个方向行驶,您最终都会回到起点)。

我可以毫不费力地将船和物体包裹起来,但是在视口本身通过游戏世界的边缘之前,背景不会出现。是否可以使背景表面“环绕”?

如果我不是很清楚,我很抱歉。这似乎是一个简单的问题,很多游戏都可以做到,但我没有找到答案。我有一些关于如何通过平铺背景来做到这一点的想法,但如果我能告诉表面进行换行就好了。

4

3 回答 3

0

我在胡闹一些类似于你描述的可能有用的东西。我决定尝试使用一个包含我所有 Tiles 的地图类,并且我只想一次将其中的一部分加载到内存中,因此我将其分解为 Sectors(32x32 tile)。我将其限制为一次仅加载 3x3 扇区。当我的地图滚动到边缘时,它会卸载另一侧的扇区并加载新的扇区。

我的 Map 类将具有所有已加载扇区的 Rect,而我的相机将具有其所在位置的 Rect。每个刻度我都会使用这两个矩形来查找我应该 blit 的地图的哪一部分,以及是否应该加载新的扇区。一旦你开始改变加载的扇区,你必须改变

每个扇区具有以下属性: 1. 它的坐标,其中 (0, 0) 是世界上左上角最可能的扇区。2. 其相对扇区坐标,(0, 0) 是左上角加载最多的扇区,如果加载了 3x3,则 (2,2) 是右下角。3. 保存扇区区域的 Rect 4. 指示扇区已满载的布尔值

每个游戏滴答都会检查 bool 是否已完全加载,如果没有,则在生成器上调用 next,该生成器会将 X 块拼贴到地图表面上。我

  1. 整个表面
  2. 每次更新都会卸载、加载或更新现有扇区
  3. 当现有扇区更新时,它会发生变化

它会在更新时卸载扇区,然后创建所需的新扇区。创建后,每个扇区将启动一个生成器,每次更新会 blit X 数量的图块

于 2012-10-27T03:24:25.080 回答
0

我不这么认为,但我有一个想法。我猜你的背景水平环绕并且总是向右,然后你可以将部分开头附加到背景的结尾。

例如,如果您有一个 10,000 像素的背景并且您的视口是 1000 像素,则将前 1000 像素附加到背景的末尾,这样您将有一个 11,000 像素的背景。然后当视口到达背景的尽头时,您只需将其移动到 0px 位置并继续向右移动。

于 2012-10-25T11:59:05.353 回答
0

谢谢大家的建议。我最终做了一些与提供的答案有点不同的事情。本质上,我制作了主表面的子表面并将它们用作缓冲区,只要视口包含世界之外的坐标,就会适当地显示它们。因为滚动是全向的,所以我需要使用 8 个缓冲区,每边一个和所有四个角。我的解决方案可能不是最优雅的,但它似乎运行良好,没有明显的性能下降。

于 2012-10-30T00:05:33.127 回答