Создание карты 2D-плитки
Я разрабатываю движок 2D-плитки, и в данный момент я работаю над алгоритмами генерации карт.
Я пробовал базовые, обычно участвующие в создании простой генерации, например
- поколение горных пород
- perlin noise
- алмазный квадрат
но я всегда получаю ту же проблему: такие алгоритмы кажутся подходящими при работе с картами плитки, которые также имеют компонент высоты, но это не мой случай.
У меня в основном есть спрайты, такие как трава, море, пустыня и т.д., но они не должны размещаться внутри карты в соответствии с порожденной высотой, но что-то вроде
- все начинается с океана
- острова расположены в середине карты (именно там чаще всего выполнялись алгоритмы, которые я пробовал)
- пустыня (они должны быть похожими на случайные пятна)
- цепи гор и холмов порождаются (они должны быть как змеи).
Какой подход я должен попробовать?
Я решил проблемы с субкомпонентами (например, пустыни, холмы и горы), разработав специализированные алгоритмы для того, чтобы делать то, что мне было нужно (например, гора начинается с точки, а затем идет по направлению с возможностью поворота), но я терпеть неудачу с генерация основных островов (которые можно было бы настраивать, чтобы быть просто пангеей или многими степенями размера).
Просто, чтобы дать вам практическое представление, что я ищу, это что-то вроде алгоритма цивилизации:
![alt text]()
Ответы
Ответ 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]()