Правильный способ «случайным образом» генерировать протекающую местность

9

Я создаю простую игру RTS сверху вниз. Я планирую «случайным образом» генерировать карты на лету, когда мне это нужно. Я планирую все это работать в «проходах»:

  1. Заполните местность всей травой
  2. Вернитесь и добавьте несколько случайных всплесков гравия.
  3. Округлить гравий
  4. Нарисуйте горный пейзаж на втором слое
  5. Вокруг горы
  6. и т. д.

Теперь взгляните на эту картинку ниже:

введите описание изображения здесь

Я сделал это вручную, используя мой редактор карт, но я планирую, что это будет в основном результатом после, надеюсь, паса / шага 3.

Как мне решить, когда и где разместить гравий так, чтобы он был по крайней мере неправильной формы и достаточно спорадическим, чтобы выглядеть естественным?

Спасибо, если можете! Любая помощь приветствуется!

Как примечание стороны:

Каждый проход, в основном, проходит через все мои тайлы (карта разделена на тайлы 40х40), примерно так:

for (int x = 0; x <= GRIDMAX - 1; x++) {
    for (int y = 0; y <= GRIDMAX - 1; y++) {
        //Terrain(x, y, 0) = SomethingHere;
    }
}
Freesnöw
источник

Ответы:

5

Вы можете поиграть с Perlin Noise ( см. Мой ответ о реализации StackOverflow ), чтобы создать карту высот. Из карты высот вы можете отобразить определенные диапазоны высоты на разные плитки. Что-то вроде:

  • Топ 20% снега
  • Следующие 20% Гравий
  • Следующие 40% травы
  • Последние 20% воды

Вам придется поиграть со значениями генератора Perlin Noise, чтобы получить ландшафт, который можно сгенерировать и выглядеть красиво.

Ник Бэнкс
источник
5

Как уже говорили другие, шум перлина должен быть хорошим источником данных для принятия решения о том, где размещать различные типы плиток. Я хотел бы дополнить эту идею и связать два дополнительных ресурса, которые могут быть полезны с третьим шагом в вашем контрольном списке - округление углов .

Этот процесс называется авто-мозаикой, и его не так сложно реализовать. Есть много разных способов сделать это, но большинство из них полагаются на вычисление информации о смежности для каждой плитки, чтобы решить, какой рисунок должен быть нарисован в этом месте.

Очень элегантный способ решить эту проблему - назначить уникальное значение флага для каждого смежного направления мозаики и расположить свой spritehseet таким образом, чтобы полученное значение, сложив вместе все смежные флаги мозаики, соответствовало правильному положению плитка в спрайт-листе. Прочитайте эту статью для очень четкого описания техники.

И вот еще один ресурс, который описывает другой вариант техники.

Дэвид Гувея
источник
Эй, просто чтобы вы знали, ваш ответ был чрезвычайно полезен в том, что касается поворотов. Огромное спасибо :) На самом деле все теперь работает (даже закругления углов)!
Freesnöw
4

По сути, вы можете использовать Perlin Noise поколения для создания ваших карт. Вы должны сэмплировать сгенерированную карту высот и назначить гравийные блоки частям карты, которые имеют высоту выше определенной.

Вот отличный справочный пост о том, как реализовать такую ​​систему и различные типы ландшафта, которые вы можете создать.

В примерах гораздо больше шагов, чем нужно, но концепция та же.

Подробнее о мире поколения Minecraft

http://www.gamedev.net/blog/33/entry-2227887-more-on-minecraft-type-world-gen/

введите описание изображения здесь

Дэвид Янг
источник