【问题标题】:How to divide a runtime procedural generated world into chunks如何将运行时程序生成的世界划分为块
【发布时间】:2011-10-11 21:36:57
【问题描述】:

我一直在考虑制作一个带有伪无限运行时程序生成世界的自上而下的 2D 游戏。我已经阅读了几篇关于程序生成的文章,也许我误读或误解了它们,但我还没有遇到一篇解释如何将世界划分为块的文章(就像 Minecraft 显然所做的那样)。

显然,我只需要生成玩家当前可以看到的部分世界。例如,如果我的游戏是基于图块的,我可以将世界划分为 n*n 个块。如果玩家在这样一个块的边界,我也会生成相邻的块。

我想不通的是,我究竟如何采用程序世界生成算法,并且一次只在一个块上使用它。例如,如果我有一个算法可以生成一个大型结构(例如城堡、森林、河流),该结构会分布在许多块中,我该如何调整它以仅生成一个块,然后生成相邻的块?强>

如果我完全遗漏了一些明显的东西,我深表歉意。提前谢谢!

【问题讨论】:

    标签: procedural-generation


    【解决方案1】:

    研究Midpoint displacement algorithm。请注意,沿一侧的点均基于角的起始值。您可以在不知道网格的其余部分的情况下计算它们。

    我使用这种方法来生成地形。我需要每个“块”地形的边缘与相邻块对齐。使用中点位移算法的变体,我做到了,沿着块边缘的每个点的高度仅基于两个角的值来计算。如果我需要添加随机性,我会使用来自两个角的数据播种一个随机数生成器。这样,任何两个相邻的块都可以独立生成,并且边缘肯定会匹配。

    您可以将高度图的方法用于其他事情。这些数据可以确定植被类型、人口密度等,而不是高度。而不是山丘和山谷匹配的高度图块,您可以拥有森林匹配的植被图。

    对于任何类型的复杂世界,肯定需要一些创造性的编程。

    【讨论】:

    • 非常感谢!我会调查的。
    • +1 表示中点位移。这是一个很好的起点,因为它很容易实现和理解(而且速度也很快)。只有当您从中点位移得到的伪影成为问题时,才可能值得研究一下 perlin 或 simplex 噪声,它们更复杂且使用起来不直观。
    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多