Как сделать рандомную генерацию мира

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

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

Итак, идея в чём:

Нужно сделать мир в виде парящего островка.
Размеры островка варьируются от 1200 пкс на 700 до 2500 на 1000.
(при блоке в 25 пкс)

Форма должна быть рандомной, но иметь горы, ямы и что-то в форме сталактитов снизу(разумеется, всё с помощью блоков песка, травы, дерева и т.д.).
Горы между собой могут пересекаться, ямы же не могут пересекаться с горами(хотя, возможно, это не верно - если так не нужно, поправьте меня)

Как я себе это представляю:
1)Генерация квадрата с размерами - 1200 + int(Math.random()*(2500 - 1200)), 700 + int(Math.random()*(1000 - 700)).

2)Разместить скелет, который будет обрастать землёй - полоску земли ровно по вертикальному центру.

3)Задать пределы гор(минимум - 2 горы, максимум - 6)

4)Рандомно определить, сколько будет гор и циклом "нарастить" их в рандомных местах, также размеры гор рандомно.

5)Нарастить ещё некоторую толщу земли, но в местах, прилегающих к границам прямоугольника делать это рандомно.

6)Алгоритм создания ямы
результирующая точка = Math.random() * ширина прямоугольника;
если(задевает зону горы)
результирующая точка = рекурсия;
>

7) Сталактиты уже более-менее понятно, как реализовать.

Хотелось бы максимально естественно сформировать островок.

8) Как быть с пещерами - вот вопрос?

Мысль насчёт пещер - сделать около 50 рандомных точек на карте, и те, что близко друг к другу - объединить коридорами. Но как-то это не очень естественно, жду дальнейших идей.

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

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

Генерация рельефа в виде анкерных точек вершин и впадин
Генерация контура карты по анкерным точкам
А затем проверять каждые 25 пикселей вхождение в фигуру по каким-то формулам проверки столкновения, и если входит - то рисовать в этом месте блок? Таким образом?
А как быть с кривыми линиями? Есть ли для этого формулы?

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

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

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

Степень реалистичности, прямопропорционально ваших способностям к созданию и обработку инструкций

Я бы создал библиотеку рельефов. У каждого рельефа есть два доп. свойства которые указывает есть ли необходимый тип рельефа соседа, или наоборот тот который не может быть смежным с данным.
Естественно каждый рельеф имеет свои интервалы значении генераций по высоте
И создаем основную инструкцию, мол рандомно генерим слева на право, перемешанный список типов рельефов. естественно, если нужно два рельефа гор - в списке 2 типа гор.
Во время каждом проходе генерации, проверяем, есть свойствойсто (не)обязательного типа рельефа-соседа, если есть, выполняем дополнительную итерациию этого типа рельфа, или налаживаем условие, что следующий не может быть каким-то из типов. Теоретически, я бы, наверное сделал так.

AlexCooper, спасибо большое, золотые советы.
Спасибо за интерактивную демонстрацию, помогло понять принцип.

Вот после этого попытаюсь разрисовать все детали сам. Далее покажу результат.

Я бы применил псевдорандомный генератор. Тогда, зная seed, всегда можно сгенерировать один и тот же ландшафт.

Я бы применил псевдорандомный генератор. Тогда, зная seed, всегда можно сгенерировать один и тот же ландшафт.
Надо отметить, что так сделано в майнкрафте.

Ещё есть игра StarBound, такая же песочница как и террария. Её разрабы ведут блог, в котором пишут о ходе разработки. Как-то, один из них писал об рандомной генераций их мира, даже графики были.

Я бы применил псевдорандомный генератор. Тогда, зная seed, всегда можно сгенерировать один и тот же ландшафт.

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

Спустя час зашёл снова, ничего не изменилось.

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

Самая очевидная - это острые углы границы каньона, где смешивание переходит от 100% первичной поверхности, и быстро начинает переход к нижнему ландшафту. Это может быть решено некоторым сглаживанием в смешивателе (что требует изменений в движке). Следующая проблема без очевидного решения - это что же делать с задним фоном. Из-за количества измерений и ограниченного числа слоёв, становится сложно визуально отличить открытую долину от длинного, узкого каньона от глубокой дырки. Мне придётся экспериментировать дальше, чтобы найти удовлетворительное решение.


//Ушёл читать статьи про алгоритм Перлина.

Ничего не могу сказать, попробуйте выключить и включить. :о)))

Нашёл таки.
Статья от разраба, про генератор пещер. То что тебе нужно.

О, на русском! Спасиб, спасииб.

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

А вообще, не ожидал, что удастся откопать столько полезной информации, спасибо, Tails, спасибо, AlexCooper.
Я уверен, что этому перлинному шуму можно найти применение там, где я ранее не знал, что использовать.
Но надо ещё чуточку времени для усвоения.


Генерация карты — это процесс случайного создания географических и геологических объектов на карте при первом запуске игры на пустом слоте для игрового мира. Процесс генерации отображается на шкале, которую можно увидеть при первой генерации карты. Но при этом карта генерируется не до конца. Она будет продолжать генерироваться по мере продвижения вами по карте. Это сделано для того, чтобы не нагружать игру и компьютер генерацией при первом запуске.

Алгоритм генерации [ ]

Генерация местности происходит в следующие несколько этапов:

Генерация биомов [ ]

Примерный график генерации биомов

Это визуализация простого двумерного шума Перлина.

С помощью шума Перлина создаются карты температуры и влажности.

Также на температуру влияет высота. Исключая болото, через каждый блок над уровнем моря (y = 64) температура становится ниже на 1/600. Температура влияет не только на карту биомов, но и на наличие осадков (За исключением грозы, возникающей в любых биомах Верхнего мира). На частоту выпадения осадков влияет влажность. В зависимости от температуры и влажности генерируется карта биомов. Биом реки генерируется на стыке двух биомов или с некоторым шансом в пределе одного биома.

Генерация ландшафта [ ]

В ранних версиях игры для придания миру формы была использована карта высот на основе двумерного шума Перлина. Или, если быть точнее, несколько карт высот. Одна для общей высоты, одна для шероховатости ландшафта и одна для мелких деталей. Для каждого столба блоков высота равнялась (общая высота + (шероховатость×детали))×64+64. Карты общей высоты и шероховатости были гладкими, сильно масштабированными шумами, а детали были более мелкими. У этого метода было замечательное преимущество в скорости, так как нужно было проводить всего 16×16×(количество_шумов) расчетов на чанк, но его недостатком был скучный ландшафт. В частности из-за невозможности генерировать нависающие над землей выступы.

К сожалению, мгновенно появились проблемы производительности и играбельности. Первые — из-за большого количества требуемых расчетов, вторые — из-за отсутствия плоских местностей и гладких холмов. Решение обеих проблем заключалось в понижении разрешения при расчетах (8x масштабирование по горизонталям и 4x по вертикали) и достраивании ландшафта с помощью линейной интерполяции. В игре появились плоскости и холмы, а заодно исчезло большинство парящих в воздухе блоков.

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

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

Minecraft

Minecraft

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

No Man’s Sky

No Man’s Sky

В No Man’s Sky генерируется вся вселенная – а это 18 квинтиллионов планет, которые можно посетить в космическом приключении. Игрокам предстоит исследовать галактики, добывать ресурсы, строить базы и сражаться с врагами. Делать это можно в кооперативе, в том числе кроссплатформенном. Несмотря на негативные отзывы на старте, сейчас No Man’s Sky – один из лучших боевиков с открытым миром.

Deep Rock Galactic

Deep Rock Galactic

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

RimWorld

RimWorld

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

The Binding of Isaac

The Binding of Isaac

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

Spelunky

Spelunky

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

Rogue Legacy

Rogue Legacy

Into the Breach

Into the Breach

В пошаговой стратегии Into the Breach человечество путешествует по альтернативным временным линиям, пытаясь спасти цивилизацию от нашествия гигантских монстров. Каждый уровень представляет собой головоломку, в ходе которой игрокам, управляющим мехами, необходимо продержаться в бою против чудовищ и не допустить уничтожения ключевых объектов. Окружение создается рандомно, поэтому игроки не знают, чего ожидать от каждой следующей миссии.

Remnant: From the Ashes

Remnant: From the Ashes

Хардкорный ролевой экшен генерирует планировку уровней, расположение врагов и боссов для каждого игрока, за счет чего геймеры получают уникальные приключения. Ваше прохождение будет отличаться от прохождения другого геймера, но вы можете посещать миры друг друга и совместно сражаться с монстрами. Кроме того, поведение тварей в Remnant: From the Ashes регулирует ИИ-режиссер, и если ему покажется, что вы слишком легко преодолеваете испытания, он тут же исправит этот недочет с помощью волны особо сильных противников.

Серия Borderlands

Borderlands

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

Elite: Dangerous

Elite: Dangerous

X-COM: UFO Defense

X-COM: UFO Defense

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

Nosferatu: The Wrath of Malachi

Nosferatu: The Wrath of Malachi

Классический хоррор-шутер Nosferatu: The Wrath of Malachi предлагает игрокам спасти семью главного героя из лап вампиров, заточивших его родственников в огромном замке. Ключевой особенностью игры стала процедурная генерация расположения комнат, что значительно усиливает напряжение – ведь выполнить задания необходимо за определенное время, и отсутствие плана локации дезориентирует игрока.

Серия Civilization

Civilization

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

Spore

Spore

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

Don’t Starve

Don’t Starve

Действие Don’t Starve разворачивается в случайно сгенерированных альтернативных мирах, и игрокам предстоит собирать ресурсы, добывать пищу, а также следить за уровнем рассудка главного героя, который вынужден противостоять невиданным кошмарам. Выживать можно вместе – для геймеров, не желающих оставаться в одиночестве, разработчики подготовили кооперативное дополнение Don’t Starve Together.

Starbound

Starbound

Захватывающая песочница Starbound генерирует все – от планет до предметов, и поэтому игроки постоянно будут открывать что-то новое в своих космических путешествиях. Каждый мир в игре – уникален, и он может отличаться от других самыми разными параметрами, включая даже силу гравитации! В совокупности это дает огромное количество контента, который можно исследовать годами.

Battle Brothers

Battle Brothers

В тактической RPG с открытым миром Battle Brothers мир создается заново в каждой новой игре. Расположение поселений и лагерей разбойников, количество и плотность отрядов, события – все это генерируется случайным образом. Вместе с тем, также здесь есть и перманентные глобальные события, с которыми игроку так или иначе придется столкнуться.

Dwarf Fortress

Dwarf Fortress

Dwarf Fortress – это популярный бесплатный roguelike, в котором игроки строят подземную крепость дварфов в процедурно созданном мире. Перед началом игры можно задать некоторые параметры, вроде размера мира, количества опасных локаций, насыщенность ресурсами и так далее, при этом вселенная игра подчиняется определенным правилам и меняется в зависимости от степени воздействия на нее игрока.

Серия Diablo

Diablo

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

Returnal

Новый трейлер и подробности Returnal

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

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

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

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

Хочу создать поле боевых действий с 2 базами по краям и что бы всё что между базами автоматически генерировалось при загрузке. Нужно что бы генерировались окопы, высокая трава и валуны в разном порядке. Я не понял как это сделать с использованием talemap.

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


Ссылочки

RuGaRu писал(а): Добрый день , только начал изучать констракт , вопрос возможно совсем глупый.

Хочу создать поле боевых действий с 2 базами по краям и что бы всё что между базами автоматически генерировалось при загрузке. Нужно что бы генерировались окопы, высокая трава и валуны в разном порядке. Я не понял как это сделать с использованием talemap.

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

Tilemap.capx (173.19 КБ) Скачиваний: 135

Читайте также: