Генерация 2D-карты листов
Я разрабатываю 2D движок плитки и в данный момент я работаю над алгоритмами генерации карты.
Я пробовал основные из них, обычно участвующих в простой генерации heightmap, как
- холм
- Перлин шума
- Diamond площадь
но я всегда получаю ту же проблему: этот вид алгоритмов кажется подходящим при работе с картами плитки, которые также имеют компонент высоты, но это не мой случай.
У меня в основном есть спрайты, такие как трава, море, пустыня и так далее, но они не должны быть размещены внутри карты в соответствии с сгенерированной высотой, но что-то вроде
- все начинается с океана
- острова помещаются в середине карты (это где алгоритмы, которые я пробовал в основном не удалось)
- пустыни генерируются (они должны быть как случайные пятна вокруг)
- цепи горы и холмы порождены (они должны быть как змеи)
какой подход я должен попробовать?
Я решил проблемы подкомпонентов (например, пустыни, холмы и горы), разработав специализированные алгоритмы, чтобы сделать то, что мне нужно (например, гора начинается с точки, а затем следовать направлению с возможностью поворота), но я терплю неудачу с генерацией основных островов (которые могут быть настраиваемыми, чтобы быть просто Пангеей или многими степенями размера).
просто чтобы дать вам практические идеи что я ищу-это что-то вроде алгоритма цивилизации:
2 ответов
[поколение холма, Перлин, алмазный квадрат] ... этот вид алгоритмов кажется подходящим при работе с картами листов, которые также имеют компонент высоты, но это не мой случай.
но это ваше дело. Горы выше равнин, а равнины выше воды.
___/
___/ ___ Mountain cutoff
___/
______/
____/ ___ Water cutoff
__/
вы можете квантовать свои данные так, что если он находится между одним набором уровней, он считается одним типом плитки, тогда как когда он находится в другом диапазоне, это другой тип плитки. Вы будете выбрасывать некоторые детали, но вы все равно получите контуры, которые соответствуют типу шума, который вы генерируете.
это, вероятно, займет хорошее количество настроек и потребует от вас генерировать другие функции земли (кроме непроходимых гор) самостоятельно, но вам придется много настраивать с любым решением для генерации контента.
Я использовал подход, который другие называют через "муравьев" для создания случайной местности. Описание используемого подхода:
во-первых, я создал tilemap,используя двумерный прямоугольный массив (x, y) специализированного класса листов. Класс tile содержит информацию, связанную с плиткой, такую как точка рисования и тип местности.
затем я создал специальный класс "ant", который можно рассматривать как невидимую сущность, которая делает" шаги " вокруг tilemap. Каждый раз, когда муравей перемещается на новую плитку, базовый тип местности изменяется. Муравей может двигаться в 8 направлениях, и он меняет направление, каждый раз, когда он переместил одну плитку. Направление его после каждого шага является случайным.
Я порождаю фиксированное или случайное количество муравьев с фиксированным или случайным количеством жизни. Время жизни-это количество плиток, которые он может пройти / шаг до удаления.
чтобы иметь возможность контролировать, какой местности чаще всего, я создаю массив типа" terrain". Этот массив содержит список типов местности (в основном только int). Чтобы получить равный баланс между всеми типами местности, добавьте только один из каждого типа местности в массив типов местности. Если вы хотите, чтобы определенный тип местности был более распространенным, вы бы добавили дополнительные записи в массив с этим конкретным типом местности.
затем, когда муравью нужно определить, какую местность изменить, вы выполняете поиск в массиве типа terrain, используя случайное целое число как индекс массива.
требуется немного настроить параметры (количество муравьев, время жизни муравьев, массив типа terrain), но до сих пор я добиваюсь действительно хороших ландшафтов.
Он может быть дополнительно расширен за счет использования более сложных типов классов ant, которые, например, пересекаются в специализированных шаблонах и т. д. Для создания правдоподобных островов в океане вы, вероятно, захотите изменить поведение муравьев, чтобы у них были некоторые ограничения с точки зрения того, как двигаться (поэтому вы не случайным образом получают длинные "шипы" земли, очень рассеянные небольшие острова и т. д.).
ниже приведен пример tilemap леса, который генерируется процедурно небольшим приложением, которое я сделал, используя подход ant. Надеюсь, это может настроить вас на ваш путь!
вы можете получить источник приложения (VB.NET) at Github