【问题标题】:How can i get a two dimensional terraria like a map using python如何使用 python 获得像地图一样的二维泰拉瑞亚
【发布时间】:2020-08-18 09:19:39
【问题描述】:
我正在尝试获得像 Terraria 游戏那样的自然景观。我使用元胞自动机为表面生成洞穴和 1d Perlin 噪声。结果是这样的:my prototype
但这对我来说并不令人满意,因为最初的目标是得到这样的东西:
what i want to get
我知道在第二种情况下,也使用了 Perlin 噪声,但我完全不知道如何实现这一点。有人可以建议我如何使用 Perlin 噪声实现第二种情况和/或提供有关此主题的适当链接吗?
【问题讨论】:
标签:
python
game-development
procedural-generation
perlin-noise
【解决方案1】:
我会做什么:
-
对 2D 噪声使用 Simplex 而不是 Perlin。 Simplex 避免了许多 Perlin 的可见网格对齐特性。您可以在this image 中看到,顶部的 Perlin 非常遵循 45 度和 90 度方向。我创建/使用/推荐的噪音将是 this,特别是 Noise2_XBeforeY 函数,因为它具有旋转的三角形网格以试图看起来最适合泰拉瑞亚风格的游戏。(编辑:自你使用的是 Python,你可以使用this)
-
以abs(noise(frequency*x, frequency*y)) < threshold ? cave : leave_solid 开头。调整频率阈值,直到它们产生所需的大小/分布。
-
利用分形噪声改善洞穴的形状和变化。 abs(noiseA(frequency*x, frequency*y) + noiseB(2*frequency*x, 2*frequency*y)*0.5 + ...) < threshold ? cave : leave_solid
-
与高度进行比较,以使洞穴随着您的上升而变小。用你在地下多远的一些函数替换阈值,例如threshold = f(height(y) - y),其中f(t) = 类似于t / (t + 1)。请注意height(y) - y 是如何随着您越深入地下而变得越大(假设 Y 在您下降时为负数)和 t / (t + 1) preserves the increasingness but smoothly prevents it from exceeding 1。 f(t) = t / (t + 1) 可能无法单独工作,因此您可能需要像 f(t) = thresholdMax * t / (thresholdIncreaseRate * t + 1) 一样对其进行概括。选择最适合您目的的 thresholdMax 和 thresholdIncreaseRate 值。