Генерация случайной карты

63

Я запускаю / запускаю RPG-игру с 2D-картами плиток на Java и хочу реализовать случайную генерацию карт. У меня есть список различных тайлов (грязь / песок / камень / трава / гравий и т. Д.), А также тайлы с водой и дорожки, проблема в том, что я понятия не имею, с чего начать при составлении карты случайным образом.

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

Я не прошу никого писать мне весь код или что-нибудь, просто направьте меня в правильном направлении, пожалуйста.

tl; dr - Создайте карту тайлов с биомами, путями и убедитесь, что биомы плавно переходят друг в друга.

Том О
источник

Ответы:

68

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

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

введите описание изображения здесь

Или это

введите описание изображения здесь

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

Я использую эту стратегию в своей игре, и она очень быстро производит такие карты:

введите описание изображения здесь

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

И вот еще несколько, чтобы вы начали:

Как я могу создать случайный «мир» в движке плиток?

Как я могу определить характерные регионы в процедурном мире?

Как создать мозаичный сплошной шум для генерации карт?

MichaelHouse
источник
Несмотря на то, что ссылка Polygonal Map Generation for Games - очень хорошая статья, я не думаю, что она очень хорошо подходит для этого вопроса, потому что а) она не является сеткой тайла карты и б) у нее нет биомов - текстура местности в зависимости от высоты.
Тапио
@Tapio Вы правы, я обновился с дополнительной информацией.
MichaelHouse
@ Byte56 Спасибо, все это дает мне отправную точку! :)
Том О
@ Byte56 Я заметил, что вы упомянули мой вопрос пару лет назад, поэтому я обновил его рабочим кодом!
Ник Бадал
1
Кстати, проект создания карты полигонов был создан для игры, в которой была карта тайлов, которая не отображала высоты. Высоты и полигоны предназначены для создания биомов, но на самом деле они не показаны в игре.
amitp
29

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

В отличие от других ответов, вы начинаете это с совершенно пустой карты. Начните с того, что вы считаете уровнем моря. Используйте Perlin Noise, чтобы добавить очень небольшое изменение, если у вас есть 256 возможных возвышений, не изменяйте больше чем 3-5 в любом направлении. Это строит первые несколько миллиардов лет вашего ландшафта без необходимости фактически запускать симуляцию так долго.

Тектоника плит

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

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

  • Если обозначенная пластина пересекает не обозначенную пластину, не обозначенная пластина становится противоположным типом. (Таким образом, пластины UD становятся ниже при пересечении.)
  • Там, где верхняя пластина находится над нижней пластиной, все эти плитки перемещаются вверх по ступеням на 0-1, и плитки следуют по пути над плитой.
  • Там, где верхняя пластина пересекает верхнюю пластину, все эти плитки перемещаются вверх на 1-2 ступени, и плитки в области пересечения перестают дрейфовать.
  • Когда нижняя пластина пересекает нижнюю пластину, любые плитки в области с возвышением, превышающим отметку 66%, для обеих плит в области пересечения перемещаются вверх на 1-3 шага (как будто из-за вулканической активности это приведет к образованию островков в течение достаточного времени ) и плитки в этой области перестают перемещаться.

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

После выполнения желаемого количества шагов. Вероятно, 5-10 достаточно. Любые плитки, где нет пластин, должны быть сброшены до самого низкого существующего уровня.

Большой или Маленький?

Эту карту можно использовать как есть или расширить, чтобы создать карту намного большего размера, разбив ее на фрагменты (ячейки) 4X4 и расширив эти участки в зависимости от их отдельных отметок. Рассматривайте высоту каждой ячейки как точку и создавайте плавную градацию на большей карте между этими точками. Таким образом, если бы большая карта была 40X40 вместо 4X4, а точка (0,0) была 10, а точка (0,1) была 1, то плитки на большей карте между ними были бы 10,9,8,7,6 , 5,4,3,2,1 в высоту. Также можно добавить Perlin Noise, чтобы разгладить склоны. В целом эта методика масштабирования аналогична алгоритму Алмазного квадрата .

вода

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

Высоты становятся поплавками или расширенными диапазонами int для более точного отслеживания. Водяные клетки имеют значения насыщения, скажем, в диапазоне 1-256. Карты должны начинаться равномерно. Вам нужно будет поиграть с числами для ваших индивидуальных размеров карты, однако в целом вы будете следовать правилам примерно так:

  • Если соседняя ячейка более насыщена, увеличьте насыщенность и увеличьте высоту.
  • Если соседняя ячейка менее насыщена, уменьшите насыщенность и потеряйте высоту.

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

Вы можете сохранить данные о температуре и насыщенности для использования, как и в других ответах, для создания биомов. Они должны быть НАМНОГО более точными и интересными. Со снежными биомами на полюсах и горячими в середине (если вы используете плавный градуированный список температур.)

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

Развивающиеся пейзажи

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

Заключение

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

DampeS8N
источник
15

Вы можете использовать Perlin Noise для создания ландшафта, вот как работают биомы в Minecraft. Как вы можете видеть, он использует тепловую карту в сочетании с тропической картой для создания биомов.

Биомы от Майнкрафт

tversteeg
источник