从很小的时候起,我就一直对创建和绘制地图感兴趣,无论是虚构的世界政治地图还是在那些天鹅绒着色套件随附的纸板背面绘制的滑雪胜地步道地图(还记得吗?)。 但是,我在绘画方面很糟糕。 (例如,非常糟糕)
因此,我决定将对编程的热情与地图制作结合起来! 我希望能够通过单击按钮来创建像这样的地图:
- “我为什么玩电子游戏?” – cictwvsu-online –中
- 我正在制作新游戏! (是!还是不……)
- 兴趣点—使用Xcode Instruments分析Unity
- GameDev Protips:如何组建完美的游戏开发团队
- 世界与建筑商#2 –迪伦·加拉多(Dylan Gallardo)

因此,我决定使用Java启动该项目(主要是因为我熟悉该语言)并开始工作!
随机噪声
地图的基本核心是二维网格。 给每个坐标分配一些数值,就可以得到高程。 使用高程,我们可以确定对每张地图至关重要的一些非常基本的特征:
- 低海拔可以画成水
- 可以绘制中等高度的土地
- 高海拔可以画成山脉
通过这三个简单的规则,我们可以绘制一张地图。 假设我们有一个定义了每个坐标的高程网格。 由于我们将以编程方式生成这些地图,因此我们必须找出一种在每次运行程序时随机生成地图的方法。
我首先创建一个二维网格,然后遍历整个网格,将随机高程分配给每个点,然后生成一个快速的小GUI来显示它。 (低海拔颜色为白色,高海拔颜色为黑色)

看起来很棒! …如果我们要显示的是97年的电视机上的97频道是什么样的。
这种方法的问题是,我们在非常低的海拔旁边有非常高的海拔。 我们需要尝试平滑这些海拔,以防止这些剧烈的跳跃从彼此相邻的坐标开始,因此我们可以得到起伏不平的丘陵,这些丘陵通向海岸,最终通向大海。
平稳噪音
因此,让我们做到这一点! 让我们从上面的相同实现开始,但是通过平均每个点及其相邻点的高程来平滑所有高程。 考虑到这一点,我们得到如下所示的内容:

好吧,没有太大的改进,但至少看起来有点混乱。 如果我们足够努力地想象,我们可以看到数百万个小岛。 尽管这需要很多想象力!
也许我们的方法是正确的,但我们只需要更加消除噪音! 让我们尝试对每个点及其所有邻居的平均点在五点半径内的平均值进行平均,而不是对每个点的直接相邻点的高程进行平均:

好的。 因此,这比我们以前的噪声图要容易得多。 但是它看起来仍然不像地图! 更不用说以这种方式产生噪音的效率极低; 对于每个点,我们必须将其值平均与24个邻居(在5度的情况下)。 将其乘以网格中的坐标量(在上面的示例中为1,000 * 1,000 = 1,000,000),我们将进行24,000,000个比较! 将每个点的仰角与甚至更多的邻居平均,会使该操作成倍增加,并且结果看起来越来越像灰色油漆在屏幕上被窒息。
但是,让我们仍然看看它的外观! 让我们看看应用以下规则时十度的平滑噪声是什么样的:
- 低海拔是蓝色
- 高处标为绿色

不太破旧,是吗? 也许如果我们要增加度数,我们将更接近拥有大陆和海洋,但是如上所述增加度数变得太昂贵了。 生成上面的图形在我的机器上花费了将近十秒钟! 我们不能继续这种方法
佩林噪声
佩林噪声是产生随机但平滑噪声的一种非常流行的方法。 生成它的算法非常复杂,因此在这里我不会详细介绍它的实现。 但是,如果您对自己实现算法感兴趣(像我一样),则可以参考以下有用的入门指南:
佩林噪音
佩林噪声是肯·佩林(Ken Perlin)于1983年对沮丧感到沮丧的结果而开发的一种梯度噪声 。en.wikipedia.org 如何在游戏中使用Perlin Noise
(最初出现在2008年2月发行的Dev.Mag第20期中。)Perlin噪声是许多噪声的基础… devmag.org.za
经过大量的努力和一点魔力,我们得到了一些噪音,如下所示:

看起来很像Photoshop和Gimp中的“差异云”工具,是吗? 那是因为他们也使用相同或非常相似的算法来生成噪声图! Perlin noise是一种功能强大且用途广泛的算法,可用于模仿许多现实世界的现象,可以随时在网络上对其进行更多研究。 (这是非常有趣的东西!)
回到我们的地图生成中,我们现在有了一个噪声网格,它不会因邻居之间的高度变化而混乱,并且每次运行程序时看起来都不同,因为我们仍在使用随机种子来启动噪声。网格。 让我们继续看一下使用两个简单规则着色时的外观:

如您所知,Perlin噪声非常适合随机生成地图! 我们所做的只是生成一定大小的Perlin噪声(在这种情况下为1000 x 1000),然后将小于0的颜色标高设为蓝色,将大于0的颜色标高设为绿色。 就是这样,我们现在有了一张非常基本的现实地图!
请继续关注以后的文章,在其中我将为我们的地图生成器添加更多地形,谈论以程序方式生成逼真的湖泊和河流以及提出算法来放置城市!