2D平铺地图生成

时间:2011-01-16 00:29:59

标签: algorithm 2d tile procedural-generation

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

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

  • 山一代
  • perlin noise
  • 钻石广场

但我总是遇到同样的问题:这种算法在处理同样具有高度成分的平铺贴图时似乎也适用,但这不是我的情况。

我基本上有精灵,如草,海,沙漠等,但不应该根据生成的高度放在地图内,但是像

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

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

我解决了子组件的问题(比如沙漠,丘陵和山脉),通过开发专门的算法来做我需要的事情(比如山从一个点开始然后跟随一个有可能转向的方向)但是我失败了基本岛屿的生成(可以定制为仅仅是一个pangea或多个尺寸)。

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

alt text

2 个答案:

答案 0 :(得分:17)

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

首先,我使用专用图块类的二维矩形数组(x,y)生成了一个tilemap。 tile类包含tile相关信息,例如drawpoint和terrain类型。

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

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

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

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

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

可以通过使用更复杂类型的ant类进一步增强,例如遍历专门模式等。为了在海洋中制造可信的岛屿,你可能想要修改蚂蚁行为,因此它们有一些约束移动的方式(所以你不要随意获得长期的“尖峰”土地,非常分散的小岛屿等)。

下面是一个森林的示例tilemap,它是由我使用ant方法制作的一个小应用程序生成的。希望这可以让你顺利上路!

您可以在Github

获取应用程序的源代码(VB.NET)

Procedurally generated 2D tile map of a forest section

答案 1 :(得分:15)

  

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

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

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

您可以对数据进行量化,这样,如果它位于一组级别之间,则会将其计为一种类型的区块,而当它位于不同的区域时,则它是不同类型的区块。你会丢掉一些细节,但你仍会得到与你正在产生的噪音类型相匹配的轮廓。

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