Создание ландшафта в C # с использованием перлин-шума - PullRequest
0 голосов
/ 14 марта 2012

Я работаю над цивилизационной игрой на C # и XNA. Я использую двумерный целочисленный массив, заполненный циклом, для генерации тайлов, я провел тонну исследований и не смог найти способ генерирования земли, подобной местности. Может кто-нибудь объяснить, как это сделать или, по крайней мере, дать мне код, который мог бы это сделать, хотя я бы предпочел и объяснение? Спасибо.

1 Ответ

8 голосов
/ 21 марта 2012

Я использую алгоритм, подобный этому, чтобы сделать мою местность. В основном он генерирует некоторые случайные числа и использует синусоидальную волну для генерации холмов, в сочетании они дают красивый холмистый ландшафт. Обратите внимание, что вы можете добавить цикл и массив значений, если вы хотите более 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 и выберите определенные высоты, чтобы сделать пещеры и более продвинутую местность, так как теперь это то, что я делаю, но этот код здесь - хорошее начало.

...