30

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

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

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

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

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

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

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

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

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

替代文字

4

2 回答 2

17

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

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

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

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

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

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

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

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

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

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

程序生成的森林部分的 2D 平铺地图

于 2011-01-26T01:26:34.013 回答
16

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

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

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

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

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

于 2011-01-16T03:34:41.193 回答