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

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

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

Я не прошу никому написать мне весь код или что-то еще, просто напишите мне в правильном направлении.

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

60 голосов | спросил Tom O 27 J0000006Europe/Moscow 2012, 19:02:03

3 ответа


64

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

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

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

Или это

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

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

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

<p> <img src = этого видео .

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

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

Как Могу ли я идентифицировать области признаков в мире, создаваемом процедурами?

Как я могу создать твёрдый твёрдый шум для создания карты?

ответил MichaelHouse 27 J0000006Europe/Moscow 2012, 19:24:33
29

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

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

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

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

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

  • Если обозначенная пластина пересекает не обозначенную пластину, неописанная пластина становится противоположной. (Таким образом, пластины UD становятся под перекрестными.)
  • Если над плитой находится над плитой, все эти плитки перемещаются вверх по отметкам 1-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 в высоту. Дальнейший шум Перлина можно добавить, чтобы разгладить склоны. По всему этому методика масштабирования похожа на алгоритм Алмазный квадрат .

Вода

Моделировать реки и озера, океаны и водные столы. Я предпочитаю использовать клеточные автоматы .

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

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

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

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

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

Развивающиеся ландшафты

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

Заключение

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

ответил DampeS8N 27 J0000006Europe/Moscow 2012, 22:13:26
15

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

Биомы из Minecraft

ответил tversteeg 27 J0000006Europe/Moscow 2012, 20:00:36

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132