我如何使用python获取像地图一样的二维terraria

问题描述

我正在尝试获得自然景观,例如Terraria游戏。我使用元胞自动生成洞穴和表面的1d Perlin噪声。结果是这样的:my prototype

但这对我来说并不令人满意,因为最初的目标是获得类似的东西: what i want to get

我知道在第二种情况下,也会使用Perlin噪声,但是我完全不知道如何精确实现这一点。有人可以建议我如何用Perlin噪声实现第二种情况,和/或在此主题上给出适当的链接吗?

解决方法

我会做什么:

  1. 对您的2D噪波使用Simplex而不是Perlin。 Simplex避免了Perlin的许多可见网格对齐特征。您可以在this image中看到,顶部的Perlin遵循45度和90度方向。我创建/使用/推荐的噪音应该是 this,尤其是Noise2_XBeforeY函数,因为它具有旋转的三角形网格,以尝试最适合Terraria风格的游戏。 (编辑:由于您使用的是Python,因此可以使用this

  2. abs(noise(frequency*x,frequency*y)) < threshold ? cave : leave_solid开头。调整频率阈值,直到产生所需的大小/分布。

  3. 通过使用分形噪声改善洞穴的形状和变化。 abs(noiseA(frequency*x,frequency*y) + noiseB(2*frequency*x,2*frequency*y)*0.5 + ...) < threshold ? cave : leave_solid

  4. 与高度进行比较,以使上山时的洞穴变得更小。用一些关于您在地下的距离的函数来代替阈值,例如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 1f(t) = t / (t + 1)可能无法单独工作,因此您可能需要像f(t) = thresholdMax * t / (thresholdIncreaseRate * t + 1)一样将其推广。选择最适合您目的的thresholdMax和thresholdIncreaseRate值。