Страница 8 из 9

Re: Генерация мира

Добавлено: 15 фев 2017, 09:20
kipar
BreakMT писал(а):
15 фев 2017, 08:52
Я похожие карты генерировал и без всяких сложных алгоритмов - просто соединял комнаты без обхода. Почему бы не соединять их последовательно, зачем какие-то графы и "компоненты связанности"? :shock:
Картинку давай. У меня когда я пробовал получалось не очень интересно, слишком очевидные коридоры и много перекрестков. Но у тебя насколько я помню подземелья неплохо выглядели.

Re: Генерация мира

Добавлено: 15 фев 2017, 12:05
altmax
BreakMT писал(а):
15 фев 2017, 08:52
Я похожие карты генерировал и без всяких сложных алгоритмов - просто соединял комнаты без обхода. Почему бы не соединять их последовательно, зачем какие-то графы и "компоненты связанности"? :shock:

PS: посмотрел свои исходники. Я делал так - у комнаты может быть от 1 до 4 дверей. Первая дверь обязательно соединяется со следующей комнатой, остальные двери с рандомной.
В данном алгоритме комнаты раскидываются рандомно и их может быть очень много, т.е. можно кинуть не 40 комнат, как на скрине, а 100. И комнаты могут накладываться друг на друга. Если комнат прям очень много, то в итоге получается 2-3 больших зала странной формы. И если все комнаты соединять последовательно, то в итоге коридоры покроют почти весь уровень и он превратится в одну огромную комнату. А здесь вычисляются отдельные друг от друга помещения и строится минимально достаточное количество проходов.

Re: Генерация мира

Добавлено: 15 фев 2017, 13:54
BreakMT
altmax писал(а):
15 фев 2017, 12:05
BreakMT писал(а):
15 фев 2017, 08:52
Я похожие карты генерировал и без всяких сложных алгоритмов - просто соединял комнаты без обхода. Почему бы не соединять их последовательно, зачем какие-то графы и "компоненты связанности"? :shock:

PS: посмотрел свои исходники. Я делал так - у комнаты может быть от 1 до 4 дверей. Первая дверь обязательно соединяется со следующей комнатой, остальные двери с рандомной.
В данном алгоритме комнаты раскидываются рандомно и их может быть очень много, т.е. можно кинуть не 40 комнат, как на скрине, а 100. И комнаты могут накладываться друг на друга. Если комнат прям очень много, то в итоге получается 2-3 больших зала странной формы. И если все комнаты соединять последовательно, то в итоге коридоры покроют почти весь уровень и он превратится в одну огромную комнату. А здесь вычисляются отдельные друг от друга помещения и строится минимально достаточное количество проходов.
Теперь понятно, благодарю. У меня карты были довольно компактные, поэтому с такой проблемой не сталкивался.

Re: Генерация мира

Добавлено: 15 фев 2017, 16:25
Oreyn
Добавлю к теме генерации комнат.
В своей технодемке собирал карту из шаблонов комнат, при этом связующие коридоры тоже были такими-же шаблонами, а не строились связывающим алгоритмом.

Пример:
Скрытый текст: ПОКАЗАТЬ
Изображение
Шаблоны комнат хранились в json с данными о тайлах и доступных выходах, относительно некого центра. Что позволяло просто их алгоритмически крутить на 90 градусов.
В центр карты поставили стартовую комнату, добавили ее доступные выходы в пул.
Рандомно вытащили новый шаблон из доступного пула, рандомно повернули его на угол кратный 90, попробовали прислонить его к рандомному доступному выходу из пула. Не вышло - повторяем всю процедуру.
Если вышло - добавляем комнату, новые выходы в пул, те что были задействованы при соединении - убираем.
Из нюансов, тайлы стен нужно разрешать накладывать друг на друга, чтобы толщина стен между комнатами была возможна в 1 тайл.
Плюс кольцевые связывания выходов возможны только случайно, и нужно учитывать, чтобы они выходили из пула свободных входов.
Еще момент - нужно поиграться с вероятностью выпадения сегментов коридора, их обычно должно быть чуть больше.
Повторять пока критерий построенности подземелья не выполнен. Я делал что занято Н процент клеток из доступных на поле. (которые, понятно считались декрементально от Х на У всего поля размер и минус занятые тайлы при установке каждой новой комнаты.
Или же генерить все заново если закончились свободные входы или же неудачных попыток прислонить новую комнату больше лимита.

Эдакий собиратель паззлов с кристализацией от центра и в итоге получается компактный лабиринт. На больших типовых комнатах шаблоны будут видны, но на Г, Т и | образных сегментах коридора - фиг там =)

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

Re: Генерация мира

Добавлено: 20 фев 2017, 22:22
Karlo
В соседней теме вспомнил, как генерировал карты биомов. В общем суть, все делается по шумам Перлина, генерируется карта высот. Создается шум температур и накладывается на градиент температур для симуляции поясов. Далее генерируем влажность. При накладывании всех трех карт руководствуемся несложными правилами, то как - над водой влажность максимальная, в горах температура ниже и еще чето-то там было. А на основе всех наложений высчитываем биомы. В общем закидываю файлик с прогой, в ней можно поиграться картами, правда она тормозит нереально, поэтому кнопки надо нажимать много много раз, чтобы сработали. New - генерация новой карты, Hght - карта высот, Temp - карта температур, Moist - карта влажности, Bioms - сама карта, Retrn - показать общую картинку.

Re: Генерация мира

Добавлено: 21 фев 2017, 06:52
Jesus05
А как-же код :) поиграться это хорошо, но подробный алгоритм построения был бы ценнее.

Re: Генерация мира

Добавлено: 21 фев 2017, 09:25
Apromix
Неплохо бы такую штуку заточить в берлиб :)

Re: Генерация мира

Добавлено: 21 фев 2017, 12:31
Karlo
Jesus05 писал(а):
21 фев 2017, 06:52
А как-же код :) поиграться это хорошо, но подробный алгоритм построения был бы ценнее.
какой алгоритм описать? Перлина?
по сути строится 3 матрицы шума, одна градиентом(по убыванию по 'y' например), потом в пятую записываются данные, которые сравниваются в трех. Все пороги подбираются только методом тыка, так как у всех разные цели. Неделю гуглил, читал,как шумы вообще создаются, за день сделал, все просто оказывается :wink:
Могу конечно сам код привести

Re: Генерация мира

Добавлено: 23 фев 2017, 08:38
altmax
Karlo писал(а):
21 фев 2017, 12:31

Могу конечно сам код привести
Ну было бы неплохо.

Re: Генерация мира

Добавлено: 19 мар 2017, 21:56
Uvadzucumi
Раз уж раскопали такую древнюю тему, то положу сюда и свой вариант генерации карты (также на перлине основан). идея была создать остров/острова где бы и происходило все действо. результат приблизительно такой:
Скрытый текст: ПОКАЗАТЬ
Изображение
Изображение
описание алгоритма: viewtopic.php?f=7&t=1097#p34514
исходники можно тут глянуть: https://github.com/Uvadzucumi/simple-roguelike

Re: Генерация мира

Добавлено: 20 мар 2017, 08:27
Apromix
Помню-помню, сам тогда такое примерно повторил по твоему алгоритму на дельфи, но, кажись, нигде так и не использовал. Эх, ностальгия :D Удалось тогда съездить на родину :lol: ?

Re: Генерация мира

Добавлено: 21 мар 2017, 18:48
Uvadzucumi
в 15-ом ездил. а вот в 16-ом нет, снова не вышло. правда основной наш офис конторский, который сейчас в эмиратах, после лета будет перебираться в армению. я хз... может поеду... а может уже и завязывать пора. да на родину сваливать.

Re: Генерация мира

Добавлено: 22 апр 2017, 08:28
Христос
В игре XCOM 2 используется система генерации карт из заранее созданных кусочков. Это позволяет уровням быть проработанными и случайно-генерируемыми одновременно.

Re: Генерация мира

Добавлено: 15 июл 2017, 12:09
altmax
Добавил к себе в игру еще один метод генерации (точнее говоря это второй). Это будут крысиные норы в моем киберпанк-постапокалипсисе. Если я когда-нибудь его доделаю.
1. Заполняем массив случайными числами 0-100;
2. Усредняем 1-7 раз, больше усреднять смысла нет, и так всего одна большая комната остается.
3. Если больше 47 значение элемента, то это стена, меньше или равно - пустое место. Значение получено опытным путем и не мной. и я очень благодарен тому человеку, т.к. мне не пришлось перебирать 100500 вариантов. 47 реально оказалось самым оптимальным значением.
4. Ну а теперь находим комнаты и связываем их между собой. Самая ресурсоемкая часть алгоритма. Если делать данж 128х40 с одним усреднением, то получается примерно 30-35 комнат, и чтобы их все связать, уходит 1-2 секунды реального времени - не много, но уже заметно при генерации следующего уровня. Но я связываю первую со второй, потом опять ищу отдельные комнаты, снова связываю первую со второй и так до тех пор, пока не останется одна. А если комнат много, то можно связывать сразу 5-10 пар и потом проверять, так гораздо быстрее будет.
Ну и результат на скринах - 1-4 усреднения (файлы добавились почему-то в обратном порядке, потому наоборот, 4-1 усреднения :) )

Ну и есть разные методы усреднения. Я беру квадрат 3х3, вычисляю среднее значение, записываю в центр, смещаюсь к соседнему тайлу, т.е. этот квадрат смещаю на 1 ячейку. Если брать центральный элемент и по очереди усреднять его со всеми соседями, то при одном проходе матрицы там реальный муравейник получается.

Re: Генерация мира

Добавлено: 16 июл 2017, 11:17
Максим Кич
altmax писал(а):
15 июл 2017, 12:09
1. Заполняем массив случайными числами 0-100;
А «случайными» — это со встроенного рандома?