The Dynasty. Генерирующие генерации генераторы.
Привет, Пикабу! Я продолжаю разрабатывать стратегию в которой игрок берет на себя управление династией.
В этом посте расскажу о том, как работает генератор городов над которым я трудился последние 5 дней. Я не очень-то продуктивен, да :)
Что должно быть у каждого города? Название! Проще всего составить оригинальное название города составив его из заранее заготовленных частей.
Например: Mosc+ow, Lon+don, Par+is.
В общем-то результатом я остался доволен.
Теперь нужно сгенерировать города. Сказано сделано.
Цель: добиться городов выглядящих а-ля Цивилизация.
За час набросал скрипт который в случайном месте генерировал центр города - Ратушу, а потом "наращивал" вокруг него дома. В случайных местах. Если новое строение "соприкасалось" с существующими, то в этом месте появлялся дом.
Результат был так себе.
Ковальски, варианты. А в вариантах которые я нагуглил мне было лень разбираться. Пришлось немного подумать самому. В форме чего должен быть город? Ну, острова. Окей, гугл, как сгенерировать случайный остров?
Самым простым вариантом было:
Шаг 1. Сгенерировать Шум Перлина со значениями от 0 (черный цвет) до 1 (белый цвет).
Шаг 2. Создать градиентный круг исходящий из центра карты. В последствии заменил один большой круг на четыре маленьких, фигура стала больше напоминать квадрат со скругленными углами.
Шаг 3. Вычесть значения полученные на первом шаге из значений полученных на втором, присвоить значения которые стали меньше нуля нулю.
Иллюстрация для наглядности.
Вуаля! У нас есть остров! Гхм, да, я помню, что нужен был город.
Дело за малым, заполнить значения, что не равны нулю здания. Место для Ратуши выбираем случайным образом, зная ширину и длину можно легко узнать, вся ли ратуша находится в пределах "острова". Генерируем дома. Перед генерацией каждого здания проверяем, чтобы здания не пересекалось с другими.
Вот в общем то и все, что хотел рассказать.
Результат:
Да, кстати, завел паблик Вконтакте, в котором можно следить за новостями об игре.
Ссылка: https://vk.com/thedynastygame
Спасибо за внимание!
Как продолжение идеи, могу предложить (в случае больших городов) использовать фрактальный шум (картинка 1), для создания более детализированных границ. Можно поэксперементировать с "cellular noise" (картинка 2), а также использовать, к примеру, муравьиный алгоритм для прокладывания дорог и диаграммы Вороного (картинка 3), для разделения городов на регионы по богатости/застроенности.
Это как crusader kings что ли
Еще можно сделать несколько вариантов частей домов и рэндомно собирать из них дома.
Да уж, недавно я подписался на Лигу Разработчиков Видеоигр и вот такие посты очень вдохновляют. Сам мечтаю разрабатывать игры, вот учу С++ пока. Надеюсь в будущем смогу что-то делать. Автору спасибо за вдохновение.