Подтвердить что ты не робот

Создание карты 2D-плитки

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

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

  • поколение горных пород
  • perlin noise
  • алмазный квадрат

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

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

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

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

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

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

alt text

4b9b3361

Ответ 1

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

Но это ваш случай. Горы выше равнины, а равнины выше воды.

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

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

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

Ответ 2

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

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

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

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

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

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

Требуется немного уточнить параметры (ant amount, ant lifetime, array type type array), но до сих пор я достигал действительно хороших ландшафтов.

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

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

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

Procedurally generated 2D tile map of a forest section