如何在程序游戏世界中管理2D数据

时间:2018-06-20 04:00:31

标签: algorithm procedural-generation quadtree procedural-programming procedural

我正在构建一个具有程序世界的受Starflight启发的2D空间探索游戏。游戏玩法分为不同的“场景”(使用Godot术语)来管理游戏的不同“深度”。例如,星际飞行是一个场景,其中星系简单地由星体精灵表示。当玩家进入范围内时,视图将移动到太阳系场景,在该场景中,玩家将船移动到实际的太阳系内。

到目前为止,我已经通过坐标和种子的硬编码数组生成了宇宙(太阳系)。现在,我还想使宇宙生成成为程序性的,但是我猜想在内存中加载整个宇宙(一旦成为程序性的,对太阳系的数量没有真正的限制)将不会有效。

我正在考虑在第一次运行时生成Universe并将数据保存到文件中,但是我想知道如何以一种有效的方式加载相关数据,该方式将使我仅加载特定的“半径”玩家飞船周围的数据。我觉得如果我使用生成“逼真的”星系形状的生成算法,那将是一条路,因为它暗示了数据处理的许多步骤(生成了不同的簇形状,臂,斑点等,然后旋转了恒星)围绕中心旋转以模拟星系旋转等),可能太长而无法实时计算。

我想知道应该采用哪种方法来解决这个问题。它并不是真的依赖语言或引擎,因此只需参考有关该主题的通用文章和算法即可。

我还阅读了一些有关QuadTree的内容,我想在那里找到了一些东西,但是我不确定如何将其与磁盘上的文件一起使用。

在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

我有一些建议:

  • 不要在第一次运行时生成整个宇宙,仅生成在某种程度上可见的区域。然后,无需从磁盘加载整个Universe,只要在太空飞船(或其他任何物体)进入该区域的可视距离内时就生成它即可。这样可以使游戏初始化更快,并允许一个(几乎)无限的宇宙。
  • 如果您希望Universe是可修改的,则仅存储玩家所做的“编辑”。因此,如果要显示Universe的一部分,请从种子中生成该部分,然后覆盖存储的编辑。这使存储空间大大减小。
  • 要在磁盘上存储,请查看R-Tree,尤其是R*TreeR+Tree,它们是用于在磁盘页面中存储数据的。

答案 1 :(得分:0)

如TilmannZ所建议的那样,在开始游戏时,您不应该为星系生成整个数据集,因为可能不需要(除非玩家需要一次查看/交互所有数据-例如所有星星) 。如果是这种情况,例如对于星图,则最好将所有数据加载一次并将结果保存在图像文件中。

相反,您只应根据需要在播放器周围生成数据。最明显的方法是在玩家周围构建一个网格,并在玩家四处移动时保持该网格居中。随着玩家的移动,您只需要更新每个像元的概念银河坐标(而不是渲染的坐标)。然后,对于每个单元格,您可以将坐标用作诸如Perlin的值或渐变生成器的输入,以确定应该在该位置生成哪些要素。

关于“塑造”星系或宇宙,一种有效的方法是对具有所需形状的星系灰度图像的像素数据进行采样。您可以在运行时加载图像的RGB数据,并在生成星星时使用网格的坐标来获取RGB值,该值可以用作生成星星的密度因子。像素越白,该位置的星星密度越高,黑色像素反之亦然。这种方法可让您有效地绘制颜料中的银河形状。

答案 2 :(得分:0)

也许考虑不同层次的抽象。每层都使用父层,设计者输入,事件和过程生成算法来生成所需的数据。

  • “宇宙”层包含用户或随机放置的星系多边形和类型。
  • Galaxy层可以添加更多细节(螺旋臂的数量和密度)或密度图。
  • 一组太阳系。
  • 太阳系增加了恒星和行星。

仅创建当前所需元素的详细信息。