【问题标题】:Storing spawn information for 2d platformer/scroller存储 2d 平台游戏/卷轴的生成信息
【发布时间】:2010-08-15 20:26:53
【问题描述】:

我正在寻找一些关于如何最好地存储横向滚动条的生成信息的想法。我正在编写的游戏与《超级马里奥兄弟》非常相似。我试图实现的是,当你通过一个关卡时,敌人应该在特定位置产生。我想将此信息存储在关卡中,我不想只是随机生成敌人。当玩家到达特定位置(如马里奥)时,我正在寻找一种高级策略来存储和检索生成的对象。我在 Google 上找不到任何像样的教程或建议。

关卡是基于瓦片的,所以地图是瓦片[][]。现在每个图块都是 16x16 像素。

到目前为止,我看到的唯一好的建议是将产卵信息存储在二维数组中,其中第一个维度是 x,第二个维度是 y,在图块空间中给出。我对那个实现的问题是,如果我的玩家在说 (160, 0) 我想产生一个特定的敌人。但是,如果下次重置关卡时玩家处于 (160, 5) 我想生成相同的敌人。因此,要使该实现起作用,我必须对给定的 y 位置进行扫描。

我正在寻找一种更高效的存储机制。我需要一些东西,我可以快速检索正确的产卵,并且不会占用太多内存来存储产卵位置。

游戏中有什么常见的策略吗?

【问题讨论】:

  • 生成完全取决于玩家的x-坐标?
  • 不,某些关卡允许玩家上下一两个屏幕,在这种情况下,y 位置很重要。

标签: game-engine


【解决方案1】:

只要生成点不多,一个简单的列表就可以了。每个列表条目都有 XY 坐标和生成信息。只需遍历列表以确定玩家是否在生成点附近。这比稀疏填充的 2D 数组的内存效率高得多,非常容易实现,而且可能足够快。

如果结果不够快,您需要某种spatial index,kd-trees 实现起来相当简单,并且为邻近搜索提供了良好的性能。 另一种解决方案是使用局部敏感哈希,如 this paper (PDF) 中所述。

【讨论】:

  • 感谢您提供详细的答案并提供指向其他实现的链接。您如何看待使用地图(x,spawn)然后使用列表。大多数级别将比更高的更宽。大多数级别都会出现问题。有 15-50 次生成,所以不多,但我尽量避免在每个游戏更新周期扫描列表。
  • 取决于你想如何确定何时生成敌人。如果你使用类似的东西:如果玩家在 N 块之外,那么地图并没有多大帮助,因为你必须有 N 或者在二维接近 N^2 地图查找的情况下。因此,如果 N 或 N^2 大于生成点的数量,则成本更高。更好:将生成点预分类到存储桶中。说一个 10 的数组,其中第一个 elem 保存在地图的前 10 个生成点的列表(x 方向),然后是第二个 10 个,依此类推。所以你只需要检查播放器的段和两个相邻的段。数组查找比映射便宜。
  • 所以你说的是创建一个地图宽度的 1/10 的数组(在你的例子中)。那么 array[10] 数组在哪里保存了地图的 x/10 内的生成列表?
  • 例如:您的关卡是 200 格宽。然后你有一个数组 MyListType spawnPoints[10];其中 spawnPoints[0] 具有 X 在 0 和 19 之间的所有生成点,spawnPoints[1] 具有 X 在 [20;39] 中的所有生成点,依此类推。如果玩家的 X 在 42 块,那么您只需要检查 (42 * 10) / 200 == 2 (整数算术)中的列表,因此 spawnPoints[2] 在玩家的段中有生成点, spawnPoints[1] 从player, spawnPoints[3] 就从玩家那里。检查和索引计算的项目较少,非常便宜。 10 号只是一个例子。
  • 谢谢,您的帮助很大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
相关资源
最近更新 更多