随机地图生成


63

我正在启动/启动Java中的2D tilemap RPG游戏,我想实现随机地图生成。我有一系列不同的图块(污垢/沙/石头/草/碎石等)以及水图块和路径图块,我的问题是我不知道从哪里开始随机生成地图。

它需要具有地形部分(就像其中的一部分是沙子,部分污垢等),这与Minecraft拥有不同生物群落并无缝地彼此转化的方式类似。最后,我还需要向其中添加随机路径,以及在整个地图上沿不同方向行驶。

我并不是要有人写给我所有的代码或任何东西,请给我正确的方向。

tl; dr-生成包含生物群落,路径的图块地图,并确保生物群落无缝地相互融合。

Answers:


68

在网站上的许多其他相关问题中,有一篇经常链接的地图生成文章:游戏中的多边形地图生成,您可以从该文章中收集一些好的策略,但实际上不能按原样使用。

虽然不是教程,但有一篇文章介绍了如何生成矮人要塞世界地图。基本上,您会针对高度,湿度,温度和盐度生成多层噪声。然后,您将使用以下内容:

在此处输入图片说明

或这个

在此处输入图片说明

根据您之前产生的噪声层生成生物群落。通常,这会在生物群落之间提供相当平稳的过渡,并且过渡是合乎逻辑的。我还根据海拔高度修改了湿度和温度图。这自然会产生一条“木线”,并产生带有雪帽的落基山脉。

我在游戏中使用这种策略,因此可以很快生成如下地图:

在此处输入图片说明

此外,您可以在此视频的开头看到我在其他地图中滚动。

以下是一些入门指南:

如何在图块引擎中创建随机的“世界”?

如何在程序生成的世界中识别特征区域?

如何为地图生成创建可平铺的固体噪声?


虽然该游戏多边形地图链接非常好,但我认为这不是非常适合该问题的原因,因为a)它不是tilemap网格,并且b)它没有生物群落-地形纹理是根据身高。
Tapio 2012年

@Tapio是的,我已经更新了更多信息。
MichaelHouse

@ Byte56谢谢,所有这些都为我提供了一个起点!:)
Tom O

@ Byte56我注意到您几年前提到过我的问题,所以我用工作代码进行了更新!
尼克·巴达

1
顺便说一句,多边形地图生成项目是为具有不显示高度的图块地图的游戏而制作的。可以使用高度和多边形生成生物群落,但实际上并未在游戏中显示它们。
amitp

29

尽管这里的其他答案对于生成满足此特定需求的静态景观确实非常有用。如果人们想要创建随时间变化或看起来更真实的景观,可以使用其他方法来解决这个问题,您可以采用这种方法。

与其他答案不同,您从一个完全空白的地图开始。从您认为的海平面开始。使用“ Perlin噪波”添加非常小的变化,如果有256个可能的高程,则在任一方向上的变化不要超过3-5。这将建立您景观的前几十亿年,而不必实际运行那么长时间。

板块构造

沿直线或曲线拆分地图以创建板块,板块的形状越详细,您的风景就越有趣。保持它们大。给每个板一个方向,速度。在给定的时间范围内,以逐步的方式在地图上移动这些板块,并拖动它们上方的所有图块。

当两个板块交叉时,选择哪个将越过和哪个将越过,此选择可以是随机的。在下面指定的板上的瓷砖会立即降低5步高度。一旦指定板块上方或下方,以后与板块的所有互动都将遵循以下规则:

  • 如果指定的板与未指定的板交叉,则未指定的板变为相反类型。(因此,越过上方时,UD板会变得下方。)
  • 如果上盖板位于下盖板上方,则所有这些图块将向上移动0-1个海拔台阶,并且这些图块将遵循上盖板的路径。
  • 如果覆盖板与覆盖板交叉,则所有这些图块将向上移动1-2步,并且交叉区域中的图块不再漂移。
  • 如果底板越过底板,则海拔超过交叉区域中两块底板的66%标记的区域中的任何瓷砖都会向上移动1-3步(就好像通过火山活动,这将在足够的时间内产生岛状),该区域中的瓷砖停止漂移。

所有跨过每个板块的板块都将以其当前速度的20%减速。为了增加真实感,请在每步移动方向上随机添加-10%到10%的变化。

执行所需数量的步骤后。大概5-10足够了。没有板块的任何瓷砖都应降至现有的最低水平。

大还是小?

该地图可以按原样使用,也可以通过将其分解为4X4的tile(cell)块并根据其各自的高程扩展这些部分来扩展以创建更大的地图。将每个像元的高程视为一个点,然后在这些点之间的较大地图中创建平滑的渐变。因此,如果较大的地图是40X40而不是4X4,并且点(0,0)是10,点(0,1)是1,则它们之间的较大地图上的图块将是10、9、8、7、6高度为5,5,4,3,2,1。可以添加更多的Perlin噪声以使斜坡平滑。总的来说,这种缩放技术类似于Diamond Square算法。

模拟河流和湖泊,海洋和地下水位。我更喜欢使用元胞自动机

高度变为浮点数或扩展为int范围,以便进行更精细的跟踪。水槽的饱和度值在1-256范围内。地图应均匀启动。您需要使用各个地图尺寸的数字,但是通常您会遵循以下规则:

  • 如果相邻单元更饱和,请增加饱和度和增益高度。
  • 如果相邻单元的饱和​​度较低,请降低饱和度并降低​​高度。

对每个相邻单元格进行此检查。执行足够的步骤。如果需要,可以通过该温度更改丢失/获得的饱和度的量来向该仿真添加温度。您也可以根据海拔高度进行更改。应该形成天然的湖泊和河流。有些会掉入大海。(海洋可能不会以任何度量标准填充,但是无论如何,您都将在海平面以下指定要填充水的任何位置。)

与其他答案一样,您可以保留温度和饱和度数据以用于创建生物群落。他们应该更加准确和有趣。极地下雪的生物群落,中间则是炎热的生物群落(如果使用平滑的温度梯度表)。

您还可以模拟风,并因此模拟基于海拔的温度变化。如果需要,可以在运行温度模拟和水模拟之间来回移动。但是,我还没有使用温度变化来构建任何东西,因此我不会评论如何执行此操作。

不断变化的景观

如果保留周围的土地,水和热量的模拟并显着降低其影响并阻止板块移动,则可以随着时间的推移继续更改所有这些指标。我不会经常运行计算,但是您可以得到一种以这种方式响应变化的世界地图。

结论

尽管这些技术的参与程度更高,但它们会产生更加现实和不断发展的效果。拿它值钱吗?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.