【问题标题】:2D tile map generation2D瓦片地图生成
【发布时间】:2011-01-16 00:29:58
【问题描述】:

我正在开发一个 2D 瓦片引擎,目前我正在研究地图生成算法。

我尝试了通常涉及简单高度图生成的基本方法,例如

  • 山代
  • 柏林噪声
  • 菱形方块

但我总是遇到同样的问题:这种算法在处理也有高度分量的瓦片地图时似乎很合适,但我的情况不是这样。

我基本上有草、海、沙漠等精灵,但它们不应该根据生成的高度放置在地图内,而是类似

  • 一切从海洋开始
  • 岛屿位于地图中间(这是我尝试的算法最失败的地方)
  • 沙漠生成(它们应该像周围的随机点)
  • 生成了山脉和山丘链(它们应该像蛇一样)

我应该尝试什么样的方法?

我通过开发专门的算法来做我需要的事情(例如,山从一个点开始,然后沿着有机会转弯的方向)解决了子组件问题(如沙漠、丘陵和山脉),但我失败了基本岛屿的生成(可以定制为只是一个泛大陆或多种大小)。

只是为了给你一个实用的想法,我正在寻找类似于文明算法的东西:

【问题讨论】:

标签: algorithm 2d tile procedural-generation


【解决方案1】:

我使用了一种其他人称之为“蚂蚁”的方法来创建随机地形。所用方法的描述:

首先,我使用一个专门的切片类的二维矩形数组 (x,y) 生成了一个切片图。瓦片类保存瓦片相关信息,例如绘图点和地形类型。

然后我创建了一个特殊的“蚂蚁”类,它可以被认为是一个不可见的实体,它在瓦片地图周围采取“步骤”。每次蚂蚁移动到一个新的瓦片时,底层的地形类型都会改变。蚂蚁可以在 8 个方向上移动,每次移动一格,它就会改变方向。每一步走的方向是随机的。

我生成固定或随机数量的蚂蚁,它们的寿命是固定的或随机的。生命周期是它在被移除之前可以遍历/步进的瓷砖数量。

为了能够控制最常见的地形类型,我创建了一个“地形类型”数组。该数组包含地形类型列表(基本上只是一个 int)。为了在所有类型的地形之间获得平等的平衡,您只需将每种地形类型中的一种添加到地形类型数组中。如果您希望某种地形类型更常见,您可以在数组中添加更多条目,使用该特定地形类型。

然后当蚂蚁需要确定要改变什么地形时,你用一个随机整数作为数组索引在地形类型数组中查找。

需要对参数(蚂蚁数量、蚂蚁寿命、地形类型数组)进行一些调整,但到目前为止,我已经实现了一些非常好的地形。

可以通过使用更复杂的蚂蚁类类型来进一步增强它,例如以专门的模式遍历等。为了在海洋中制作可信的岛屿,您可能需要修改蚂蚁的行为,以便它们在移动方式的条款(这样你就不会随机获得长长的土地“尖峰”,非常分散的小岛等)。

下面是一个森林的瓦片地图示例,它是由我使用 ant 方法制作的一个小应用程序生成的。希望这可以帮助您前进!

您可以在Github获取应用程序的源代码(VB.NET)

【讨论】:

  • +1;这是一个有趣的方法,有点类似于Cellular Automata。看起来你基本上会得到一个带有分组的随机分布,从表面上看,这似乎是你想要的。我认为您不太可能使用这种方法获得平滑的渐变,尤其是与 Perlin 噪声相比,但我觉得它对于某些图块类型(例如树)可能更具吸引力。至于你的“数字表”,这类似于我对how to weight a PRNG的回答。
【解决方案2】:

[hill generation, perlin, diamond square] ...这种算法似乎适用于处理也有高度分量的瓦片地图,但我的情况不是这样。

但这是你的情况。山高于平原,平原高于水。

                        ___/
                    ___/ ___ Mountain cutoff
                ___/
         ______/
    ____/ ___ Water cutoff
__/

您可以量化您的数据,以便如果它在一组级别之间,它被计为一种类型的图块,而当它在不同的范围内时,它是另一种类型的图块。你会丢掉一些细节,但你仍然会得到与你产生的噪音类型相匹配的轮廓。

这可能需要进行大量调整,并且需要您自己生成其他土地特征(除了无法通行的山脉),但您必须使用任何内容生成解决方案进行大量调整。

【讨论】:

  • 如果您想了解有关程序内容生成算法、技术、经验等的更多信息,我最近found this wiki page。这似乎是一个很好的资源,并且涵盖了您在问题中提到的 hightmap 算法。不是我的网站,我也没有以任何方式参与他们 - 它看起来很棒,所以我想插入它:)
猜你喜欢
  • 2012-08-11
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多