Генерация 2D-карты листов

Я разрабатываю 2D движок плитки и в данный момент я работаю над алгоритмами генерации карты.

Я пробовал основные из них, обычно участвующих в простой генерации heightmap, как

  • холм
  • Перлин шума
  • Diamond площадь

но я всегда получаю ту же проблему: этот вид алгоритмов кажется подходящим при работе с картами плитки, которые также имеют компонент высоты, но это не мой случай.

У меня в основном есть спрайты, такие как трава, море, пустыня и так далее, но они не должны быть размещены внутри карты в соответствии с сгенерированной высотой, но что-то вроде

  • все начинается с океана
  • острова помещаются в середине карты (это где алгоритмы, которые я пробовал в основном не удалось)
  • пустыни генерируются (они должны быть как случайные пятна вокруг)
  • цепи горы и холмы порождены (они должны быть как змеи)

какой подход я должен попробовать?

Я решил проблемы подкомпонентов (например, пустыни, холмы и горы), разработав специализированные алгоритмы, чтобы сделать то, что мне нужно (например, гора начинается с точки, а затем следовать направлению с возможностью поворота), но я терплю неудачу с генерацией основных островов (которые могут быть настраиваемыми, чтобы быть просто Пангеей или многими степенями размера).

просто чтобы дать вам практические идеи что я ищу-это что-то вроде алгоритма цивилизации:

alt text

2 ответов


[поколение холма, Перлин, алмазный квадрат] ... этот вид алгоритмов кажется подходящим при работе с картами листов, которые также имеют компонент высоты, но это не мой случай.

но это ваше дело. Горы выше равнин, а равнины выше воды.

                        ___/
                    ___/ ___ Mountain cutoff
                ___/
         ______/
    ____/ ___ Water cutoff
__/

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

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


Я использовал подход, который другие называют через "муравьев" для создания случайной местности. Описание используемого подхода:

во-первых, я создал tilemap,используя двумерный прямоугольный массив (x, y) специализированного класса листов. Класс tile содержит информацию, связанную с плиткой, такую как точка рисования и тип местности.

затем я создал специальный класс "ant", который можно рассматривать как невидимую сущность, которая делает" шаги " вокруг tilemap. Каждый раз, когда муравей перемещается на новую плитку, базовый тип местности изменяется. Муравей может двигаться в 8 направлениях, и он меняет направление, каждый раз, когда он переместил одну плитку. Направление его после каждого шага является случайным.

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

чтобы иметь возможность контролировать, какой местности чаще всего, я создаю массив типа" terrain". Этот массив содержит список типов местности (в основном только int). Чтобы получить равный баланс между всеми типами местности, добавьте только один из каждого типа местности в массив типов местности. Если вы хотите, чтобы определенный тип местности был более распространенным, вы бы добавили дополнительные записи в массив с этим конкретным типом местности.

затем, когда муравью нужно определить, какую местность изменить, вы выполняете поиск в массиве типа terrain, используя случайное целое число как индекс массива.

требуется немного настроить параметры (количество муравьев, время жизни муравьев, массив типа terrain), но до сих пор я добиваюсь действительно хороших ландшафтов.

Он может быть дополнительно расширен за счет использования более сложных типов классов ant, которые, например, пересекаются в специализированных шаблонах и т. д. Для создания правдоподобных островов в океане вы, вероятно, захотите изменить поведение муравьев, чтобы у них были некоторые ограничения с точки зрения того, как двигаться (поэтому вы не случайным образом получают длинные "шипы" земли, очень рассеянные небольшие острова и т. д.).

ниже приведен пример tilemap леса, который генерируется процедурно небольшим приложением, которое я сделал, используя подход ant. Надеюсь, это может настроить вас на ваш путь!

вы можете получить источник приложения (VB.NET) at Github

Procedurally generated 2D tile map of a forest section