使用OpenSimplex噪音:https://gist.github.com/KdotJPG/b1270127455a94ac5d19
不要sommething像:
protected void generateLevel() {
OpenSimplexNoise noise = new OpenSimplexNoise(); //optionally pass in a seed.
for (int y = 0 y < height; y++) {
for (int x = 0; x < width; x++) {
double value = noise.eval(x/24.0, y/24.0, 0.5);
if (value < 0) {
tiles[x + y * width] = 6; //set water
} else {
tiles[x + y * width] = 1; //set grass
}
}
}
}
也有替代品,如柏林噪声和单纯的噪音。我会完全忽略柏林噪声,因为它往往会呈现视觉上重要的网格伪像(它将其所有特征与其底层方形网格对齐)。 2D中的单纯形噪声是可以的,尽管互联网上2D Simplex噪声的大部分实现都使用奇怪的梯度集,导致伪像沿负对角线下降。而3D单工噪音则受到专利保护。
Perlin杂VS OpenSimplex噪声,3D的2D切片:
- 左是噪声(X,Y,0)灰度
- 接下来是噪声(X,Y,0)> 0?白色:黑色
- 接下来是| noise(x,y,0)| > 0.1?白:黑
- 接下来是噪声(X,Y,0.5)灰度
编辑:下面是从注释的代码
分形噪声:
OpenSimplexNoise n1 = new OpenSimplexNoise(seed1);
OpenSimplexNoise n2 = new OpenSimplexNoise(seed2);
OpenSimplexNoise n3 = new OpenSimplexNoise(seed3);
for each x,y {
double value = (n1.eval(x/48.0, y/48.0, 0.5) + n2.eval(x/24.0, y/24.0, 0.5) * .5 + n3.eval(x/12.0, y/12.0, 0.5) * .25)/(1 + .5 + .25);
//Do whatever you need to with that value
}
河流:
if (value > -0.1 || value < 0.1)
water
else
land
生物群系:
OpenSimplexNoise n1 = new OpenSimplexNoise(seed1);
OpenSimplexNoise n2 = new OpenSimplexNoise(seed2);
OpenSimplexNoise n3 = new OpenSimplexNoise(seed3);
for each x,y {
double elevation = n1.eval(x/24.0, y/24.0, 0.5);
double temperature = n2.eval(x/24.0, y/24.0, 0.5);
double precipitation = n3.eval(x/24.0, y/24.0, 0.5);
if (elevation < 0)
water
else {
//decide biome based on temperature, precipitation, and elevation
}
}
您能否定义逼真的效果?你的地形应该成为一个拥有一些河流的岛屿吗?您可以定义河流或湖泊片段并将其随机放置在您的地形上 – Mosa 2014-10-27 22:35:40