Я запускаю / запускаю RPG-игру с 2D-картами плиток на Java и хочу реализовать случайную генерацию карт. У меня есть список различных тайлов (грязь / песок / камень / трава / гравий и т. Д.), А также тайлы с водой и дорожки, проблема в том, что я понятия не имею, с чего начать при составлении карты случайным образом.
В нем должны быть участки местности (например, часть будет песком, частью грязи и т. Д.) Подобно тому, как Minecraft находится там, где у вас разные биомы, и они плавно переходят друг в друга. Наконец, мне также нужно добавить случайные пути в этом направлении, а также идти в разных направлениях по всей карте.
Я не прошу никого писать мне весь код или что-нибудь, просто направьте меня в правильном направлении, пожалуйста.
tl; dr - Создайте карту тайлов с биомами, путями и убедитесь, что биомы плавно переходят друг в друга.
В то время как другие ответы здесь действительно хороши для создания видов статических ландшафтов, которые будут работать для этой конкретной потребности. Существуют и другие методы, которые люди, сталкивающиеся с этим вопросом, могут искать, если они хотят создавать пейзажи, которые меняются со временем или кажутся гораздо более реалистичными, вы можете следовать этой методике.
В отличие от других ответов, вы начинаете это с совершенно пустой карты. Начните с того, что вы считаете уровнем моря. Используйте Perlin Noise, чтобы добавить очень небольшое изменение, если у вас есть 256 возможных возвышений, не изменяйте больше чем 3-5 в любом направлении. Это строит первые несколько миллиардов лет вашего ландшафта без необходимости фактически запускать симуляцию так долго.
Тектоника плит
Разделите карту по прямым или изогнутым линиям, чтобы создать пластины. Чем детальнее формы пластин, тем интереснее будет ваш ландшафт. Держите их большими. Дайте каждой пластине направление, скорость. В течение определенного периода времени перемещайте листы по карте пошагово, перетаскивая все плитки над ними.
Когда две пластины пересекаются, сделайте выбор, который переместится, а какой упадет, этот выбор может быть случайным. Плитки на плитах, обозначенных снизу, мгновенно уменьшаются по высоте на 5 ступеней. После того, как табличка будет обозначена над или под, все будущие взаимодействия с табличками будут следовать следующим правилам:
Все пластины, которые пересекаются, замедляются на 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. Карты должны начинаться равномерно. Вам нужно будет поиграть с числами для ваших индивидуальных размеров карты, однако в целом вы будете следовать правилам примерно так:
Сделайте эту проверку для каждой соседней клетки. Запустите достаточное количество шагов. Если вы хотите, вы можете добавить температуру к этому моделированию, изменяя количество потерянного / полученного насыщения этой температурой. Вы также можете изменить его в зависимости от высоты. Естественные озера и реки должны образоваться. Некоторые упадут в океан. (Вероятно, океан не будет заполняться какой-либо метрикой, но в любом случае под уровнем моря вы будете обозначать что-то, что будет заполнено водой)
Вы можете сохранить данные о температуре и насыщенности для использования, как и в других ответах, для создания биомов. Они должны быть НАМНОГО более точными и интересными. Со снежными биомами на полюсах и горячими в середине (если вы используете плавный градуированный список температур.)
Вы также можете моделировать ветер и, следовательно, изменения температуры в зависимости от высоты. Вы можете переключаться между запуском моделирования температуры и воды, если хотите. Однако я не построил ничего, используя изменения температуры, поэтому я не буду комментировать, как это сделать.
Развивающиеся пейзажи
Если вы сохраняете моделирование для земли, воды и тепла вокруг и резко уменьшаете их эффекты, а также останавливаете движение плит, вы можете со временем изменять все эти показатели. Я бы не стал проводить вычисления очень часто, но вы можете получить карту мира, которая реагирует на изменения таким образом.
Заключение
В то время как эти виды техники более сложны, они производят гораздо более реалистичные и развивающиеся эффекты. Взять это за то, что оно того стоит?
источник
Вы можете использовать Perlin Noise для создания ландшафта, вот как работают биомы в Minecraft. Как вы можете видеть, он использует тепловую карту в сочетании с тропической картой для создания биомов.
источник