2D平铺地图生成

Jac*_*ack 28 algorithm 2d procedural-generation tile

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

我试过通常涉及简单高度图生成的基本方法

  • 山一代
  • 柏林噪音
  • 钻石广场

但我总是遇到同样的问题:这种算法在处理也有高度组件的平铺地图时似乎很合适,但这不是我的情况.

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

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

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

我通过开发专门的算法来解决子组件的问题(比如沙漠,山丘和山脉)来做我需要的事情(比如山从一个点开始然后跟随一个有可能转向的方向)但是我没有成功基本岛屿(可以定制为只是一个pangea或多个大小的程度).

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

替代文字

Mor*_*sbo 17

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

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

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

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

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

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

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

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

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

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

程序生成的森林部分的2D瓦片地图

  • +1; 这是一种有趣的方法,有点类似于[Cellular Automata](http://pcg.wikidot.com/pcg-algorithm:cellular-automata)。看来您基本上可以通过分组获得随机分布,从表面上看,这似乎是您想要的。我认为使用这种方法不太可能获得平滑的渐变,尤其是与Perlin噪声相比时,我认为对于某些图块类型(例如树木)而言,它可能更具吸引力。至于您的“数字表”,这与我对[如何对PRNG进行加权]的答案类似(http://stackoverflow.com/questions/3966809)。 (2认同)

Mer*_*ham 16

[山丘世代,柏林,钻石广场] ......这种算法在处理也有高度成分的瓷砖地图时似乎很合适,但这不是我的情况.

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

                        ___/
                    ___/ ___ Mountain cutoff
                ___/
         ______/
    ____/ ___ Water cutoff
__/
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果您想了解有关程序内容生成算法,技术,经验等的更多信息,我最近[发现此维基页面](http://pcg.wikidot.com/category-pcg-algorithms).它似乎是一个很好的资源,涵盖了您在问题中提到的hightmap算法.不是我的网站,我也没有以任何方式参与其中 - 它看起来很棒,所以我想插上它:) (7认同)