MonoGame中的SimplexNoise地形

时间:2015-05-17 10:29:39

标签: c# monogame procedural-generation simplex-noise

我正在MonoGame中制作一个随机生成的平铺游戏,我正在尝试使用Simplex Noise来生成地形。问题是,我之前从未使用过Simplex Noise,所以你可能猜到,我的代码不起作用。它只创造草砖。这是我尝试过的代码:

public void Generate() {
    Tiles = new List<Tile>();
    Seed = GenerateSeed();
    for (int x = 0; x < Width; x++) {
        for (int y = 0; y < Height; y++) {
            float value = Noise.Generate((x / Width) * Seed, (y / Height) * Seed) / 10.0f;
            if (value <= 0.1f) {
                Tiles.Add(new Tile(Main.TileGrass, new Vector2((int)x * Tile.Size, (int)y * Tile.Size)));
            }
            else if (value > 0.1f && value <= 0.5f) {
                Tiles.Add(new Tile(Main.TileSand, new Vector2((int)x * Tile.Size, (int)y * Tile.Size)));
            }
            else {
                Tiles.Add(new Tile(Main.TileWater, new Vector2((int)x * Tile.Size, (int)y * Tile.Size)));
            }
        }
    }
}

public int GenerateSeed() {
    Random random = new Random();
    int length = 8;
    int result = 0;

    for (int i = 0; i < length; i++) {
        result += random.Next(0, 9);
    }

    return result;
}

我正在使用this实现来生成噪音。

1 个答案:

答案 0 :(得分:1)

检查您正在使用的SimplexNoise中的第133行:

// The result is scaled to return values in the interval [-1,1].

将它除以10之后,结果将在-0.1到+0.1的范围内 你需要一个0到1的范围,所以你需要:

而不是除以10
  • 添加1(范围从0到2)。
  • 除以2(范围从0到1)。
float value = (Noise.Generate((x / Width) * Seed, (y / Height) * Seed) + 1) / 2.0f;

或者更改你的if / else以使用-1到+1范围。

if (value <= -0.8f)
{
    Tiles.Add(new Tile(Main.TileGrass, new Vector2((int)x * Tile.Size, (int)y * Tile.Size)));
}
else if (value <= 0)
{
    Tiles.Add(new Tile(Main.TileSand, new Vector2((int)x * Tile.Size, (int)y * Tile.Size)));
}
else
{
    Tiles.Add(new Tile(Main.TileWater, new Vector2((int)x * Tile.Size, (int)y * Tile.Size)));
}