我正在尝试为 2d tilemap 游戏制作地图生成器(类似于 Civilization 之类的游戏 - 我希望能够创建小岛屿或大大陆等)。我发现一篇文章几乎可以满足我的需求,但它是用 Flash 编写的。看起来有一个方便的函数可以从 perlin 噪声生成位图:
class BitmapData
function perlinNoise(
baseX:Number,
baseY:Number,
numOctaves:uint,
randomSeed:int,
stitch:Boolean,
fractalNoise:Boolean,
channelOptions:uint = 7,
grayScale:Boolean = false,
offsets:Array = null):
这在文章中使用(但我使用的是 java)。所以现在我一直在尝试自己实现 perlin 噪声(基本上是找到一个纯 java 实现并复制/粘贴它)。
我只是想了解使用柏林噪声背后的基本原理——我的基本理解:
- 定义你想要的地图大小(在我的例子中大约是 100 x 50 瓦片)。
- 初始化一个 perlin 噪声对象(设置参数,如频率等 - 不太确定这些参数如何影响岛屿大小等,但暂时搁置一旁)。
- 遍历我的地图中的每个图块,并向 perlin 噪声对象询问一个值。返回的值可以解释为我猜测的高度值。
- 现在根据高度值分配瓷砖类型。
迭代代码可能类似于:
for (int x = 0; x < 100; x++) {
for (int y = 0; y < 50; y++) {
int height = perlin.getValue(x, y);
if (height < 5); // this tile is water
else if (height < 20); // this tile is shore
else if (height < 40); // this tile is hill
else // this tile is mountain
}
}
这通常正确吗?这至少是一个起点。
我正在寻找的文章(用闪存写的): http ://www.nolithius.com/game-development/world-generation-breakdown
Flash BitmapData 类方便地内置了 perlin 噪声函数:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#perlinNoise ( )
谢谢