我正在使用C#和XNA开发文明游戏。我使用一个二维整数数组(填充有一个循环)来生成图块,我进行了大量研究,但无法找到生成地形的方法。任何人都可以解释如何执行此操作,或者至少可以给我提供可以执行此操作的代码,尽管我希望并提供解释?谢谢。
我使用与此类似的算法绘制地形。基本上,它会生成一些随机数,并使用正弦波生成山丘,将它们组合在一起会形成一个不错的丘陵景观。请注意,如果您需要超过3次传递,则可以添加循环和值数组。
private void GenerateTerrain()
{
terrainContour = new int[Width*Height];
//Make Random Numbers
double rand1 = randomizer.NextDouble() + 1;
double rand2 = randomizer.NextDouble() + 2;
double rand3 = randomizer.NextDouble() + 3;
//Variables, Play with these for unique results!
float peakheight = 20
float flatness = 50
int offset = 30;
//Generate basic terrain sine
for (int x = 0; x < Width; x++)
{
double height = peakheight / rand1 * Math.Sin((float)x / flatness * rand1 + rand1);
height += peakheight / rand2 * Math.Sin((float)x / flatness * rand2 + rand2);
height += peakheight / rand3 * Math.Sin((float)x / flatness * rand3 + rand3);
height += offset;
terrainContour[x] = (int)height;
}
}
然后填充高度图,仅遍历各个值并检查其是否高于阈值。
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
if (y > terrainContour[x])
tiles[x, y] = Solid Tile
else
tiles[x, y] = Blank Tile
}
}
您可以添加更多的内容,我添加了更多的随机性,并将某些图块向上或向下按1缩进,以获得更好的地形。并且添加更多的正弦波将使其更加逼真。
尝试使用2D Perlin Noise算法,并选择一定的高度以制造洞穴和更高级的地形,因为这是我现在要做的,但是这里的代码是一个好的开始。
这里是基本的随机Perlin噪声数的实现,您可以使用它(基于P5.js)
https://github.com/lucasteles/PerlinNoiseNet/blob/master/PerlinNoise/PerlinNoise.cs