Эксперименты с генерацией уровня

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

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

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

Есть еще две идеи.
Первая - на основе часто встречающегося алгоритма, когда по уровню раскидываются комнаты, а потом соединяются коридорами. У меня немного другая идея - делаем прямоугольную комнату, генерируем соответственно алгоритму набор комнат, однако, вместо того, чтобы добавлять их на уровень, вырезаем пространство на пересечении первой крупной комнаты и сгенерированных маленьких комнат. Таким образом, получаем эдакий "голландский сыр".
Вторая идея - делаем квадратные префабы с комнатами и коридорами, в местах сочленений делаем "сокеты", спавним начальную комнату, и уже в зависимости от наличия в ней "сокетов" спавним рандомный элемент из набора, а дальше - по аналогии с первым алгоритмом.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
24
Из последней идеи убери префабы и замени их процедурной генерацией. В итоге получится следующее: один алгоритм размечает комнаты (высота и ширина больше 1 клетки) и коридоры (высота или ширина равна 1 клетке), а второй - заполняет эти комнаты содержимым, в том числе и непроходимыми ячейками чтобы добавить немного неравномерности в структуру. "Сокеты", естественно, генерируются процедурно на первом этапе по довольно простым правилам. Дальше останется подобрать такие правила генерации сокетов и разметки комнат чтобы результат выглядел прилично.
26
prog, проблема в том, что мне, опять таки, надо будет придумывать нормальный алгоритм для процедурной генерации для каждого сегмента. Эту идею я выставил как раз как альтернативу процедурной генерации, с которой у меня некоторые проблемы.
24
lentinant, у тебя не возникало такой идеи, что если ты сталкиваешься с противником, тебя переносит на поле битвы, и там нужно совершить определённые действия? Плюс, структуру уровней можно сделать как в roguelike-играх.
26
RSQR, я все еще отталкиваюсь от того, что это должна быть игра с непрямым управлением. Идея переноса на поле боя возникала, однако, с учетом того, что игрок не управляет героем, его влияние на бой довольно таки незначительное, и бой представлялся бы исключительно в виде кат-сцены.
Структура уровней как в рогаликах как раз требует определенного алгоритма генерации, поиском которого я, собственно говоря, занимаюсь.
24
lentinant, а в чем сложность с заполнением прямоугольника? За счет разделения алгоритма на две части, одна из которых размечает сегменты, а другая заполняет их, значительно понижается вычислительная сложность каждого из алгоритмов в отдельности.
26
prog:
lentinant, а в чем сложность с заполнением прямоугольника? За счет разделения алгоритма на две части, одна из которых размечает сегменты, а другая заполняет их, значительно понижается вычислительная сложность каждого из алгоритмов в отдельности.
Ну а в каком виде вы представляете генерацию? Мне нужно, чтобы все входы были соединены. При этом, я не очень хорошо знаком с алгоритмами нахождения пути.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.