Создание 2D-карты тайлов - PullRequest
       50

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

27 голосов
/ 16 января 2011

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

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

  • поколение холмов
  • шум перлина
  • квадрат с бриллиантом

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

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

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

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

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

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

alt text

Ответы [ 2 ]

17 голосов
/ 26 января 2011

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

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

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

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

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

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

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

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

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

Исходный код приложения (VB.NET) можно получить по адресу Github

.

Procedurally generated 2D tile map of a forest section

15 голосов
/ 16 января 2011

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

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

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

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

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

...