Блог ☯

вторник, 18 апреля 2017 г.

Случайная (рандомная) генерация мира в играх. Как сделать?

Привет. Поговорим о том, как сделать случайную (рандомную) генерацию мира в игре, как генерация мира работает и зачем вообще она нужна. Сильно много общих слов писать не буду, просто покроем базовые моменты, а зачем посмотрим как генерация мира может быть сделана в гейм мейкер студио (game maker studio), программе для создания игр.

Случайная (рандомная) генерация мира в играх. Как сделать?

Итак, что вообще такое случайная (рандомная) генерация мира?

Ну понятно, это когда игровой мир генерируется случайным образом. Однако, если вы попробуйте просто например на карте 50 на 50 условных клеток сгенерировать мир, где на каждой клетке может быть случайный объект (лес, камень, дом, враг и т.д.), то у вас получиться, скорее всего, какая-то муть.

Генерация мира нужна потому, что левел дизай (дизайн уровней) это довольно затратная штука в процессе создания игр. Каждый уровень нужно прорабатывать отдельно, всё это нужно тестировать и балансировать. Это очень долго по времени, да и по деньгам.

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

Про эти вещи я говорил в своём видео о левел дизайне, оно длинное, но потом можете посмотреть.

Тема близкая к теме генерации мира.



Продолжим. Какая самая известная игра со случайной генерацией мира? Ну конечно-же Minecraft. Генерация мира в майнкрафт стоит внимания.

Я часто упоминаю Майнкрафт, упоминал эту игру еще и когда писал про Инди-Игры, но Майнкрафт нельзя не упоминать. Эта игра перевернула индустрию, дав огромный толчок как инди проектам, так и проектам со случайной генерацией мира, да и всяким другим песочницам и играм, где есть крафт.

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

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

Единственное что, в Minecraft нужно отметить так называемые биомы - большие зоны, где мир генерируется как-бы отдельно. Другой важный и очень умный момент - мир в Майнкрафт (да и в других таких играх) не генерируется весь сразу, так-как он огромен.

Там генерируется только видимая игроком область.

Это важный технический момент который стоит запомнить. При создании нового мира вы-бы ждали вечность, пока получиться новый случайный мир целиком из-за его гигантского размера. Но ведь есть простой выход! Генерируется только область около героя, ну вот она и запоминается игрой. Идёте дальше? Генерируются новые участки.

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

Еще один момент, а что такое "ключ" для генерации мира в minecraft? Это любопытная штука, так-же она называется "зерно" (seed). Дело в том, что процесс генерации хоть и кажется сложным, программно он проходит по одной схеме.


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

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

Другой мой любимый пример - это random world generator в игре Victoria II. Создали специальную модификацию, которая генерировала страны и политическую карту случайным образом. Это было великолепно.

Случайная (рандомная) генерация мира в играх. Как сделать?

Могла получиться вот такая Америка

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

Моё мнение - рандомную генерацию мира придумали ленивые разработчики игр, именно чтобы не заниматься дизайном уровней. И молодцы что придумали!

Кстати, штука это не новая, я вспоминаю такую игрушку как Elite (1984 год), одну из первых, где была генерация мира, в том случае - звёздных систем. В космосе все эти генерации работают особенно хорошо, так-как космос огромен, а его структура позволяет довольно легко генерировать миры, если только не нужно прорабатывать конкретные планеты.

Проработку конкретных планет сейчас осилила игра No Man's Sky, но игра многих разочаровала. Яркий пример того, что недостаточно сделать рандомный мир, нужно еще и сделать его живым.

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

Случайная (рандомная) генерация мира в играх. Как сделать?

Системы, планеты и звёзды всегда те-же, но расположение случайно.

Эту идею довольно любопытно взять. Например вы делайте 10 уникальных уровней, однако не обязательно делать чёткие переходы между ними (как я показывал в своём видео - локации и переходы между локациями).

Вы можете сделать локации отдельно, а потом сделать простую глобальную карту и дать игроку выбор локации. Это отличная схема, использовалась в таких играх как Fallout, или в такой замечательной игре как Князь 2: Кровь Титанов.

Так можно делать случайные локации, специальные локации для гринда и фарма, короче схема отличная. При этом вы можете это всё сочетать с левел дизайном и уже созданными картами.

Отчасти что-то похожее сделано в и играх серии The Elder Scrolls. Там как, есть глобальная карта и всё вроде понятно. Однако например в Oblivion лес и вся огромная область вне городов, во многом, генерировалась случайно. Как минимум - в плане расположения деревьев. По моему было что-то такое. Так-же там точно были пещеры, которые генерировались когда герой туда заходит. Вот это - старейшая схема и это отличная схема.

Случайная (рандомная) генерация мира в играх. Как сделать

Самые первые скрины из TES: Oblivion

Вам не нужно делать вообще все локации уникальными, вполне реально сделать 50%+ пещер и мест для фарма с помощью рандомной генерации. Главное не наглупите с автолевенгом (подбор уровня и силы врагов под героя), иначе будет тупо и скучно.

Игрок хочет чувствовать, что его усилия по прокачке и дорогие предметы стоили трудов, он не хочет встречать бомжей в супер броне возле помойки, только потому, что у него уже 50-й уровень. Если игроку захочется сразиться с достойными врагами на 50-м уровне, он сам пойдёт в специальную локацию, где эти самые элитные враги и обитают.

Это уже вопрос баланса, но он близок к автогенерации мира. Очень интересно делать какие-то мелкие шансы (на уровне 0.1 - 1%) встретить супер врага там, где быть не должно, или супер слабого врага в месте, где сплошные титаны, но это должно быть редко.

Аналогично с предметами. Очень круто и интересно найти какой-то крутой меч в самом начале, пусть будет такой шанс 1/1000 или даже меньше в случайном мире. Однако найти крутой меч куда более вероятно в какой-то сложной и поздней локации, где сильные враги. Это честно и логично.

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

Именно на всей этой системе рандомов и автогенераций строится целый жанр игр - roguelike (рогалик). Это божественные игры, если не пробовали, попробуйте. Из не самых старых советую pixel dungeon (есть даже на PC). Я в неё долго залипал.

Никто практически никогда так и не замахнулся на подобные механики рогаликов для серьезной игры с большим бюджетом, и уж тем более - mmropg. однако я всегда мечтал о такой онлайн игре, где после смерти выпадает всё и где игроки могут атаковать друг-друга в любой момент и в любой точке. Хотя вру, есть такая игра - fallout online. Но хардкор выдерживают человек 100-200, не больше.

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

Она чем-то похожа на Terraria да и на тот-же Minecraft.


Скриншот игры игры Starbound

Хорошо, ну а как делается случайная (рандомная) генерация мира в играх? Как сделать это самому в своей игре с помощью гейм мейкер студио (game maker studio)?

Я в этот раз решил не расписывать вам код, так-как на моём канале (Econ Dude YouTube) уже есть видео по этой теме, можете заценить (11 мин). Это первая часть и самая база:



Всем удачи в создании игр! 

Ну а если вам понравилась статья, не забывайте ставить палец вверх чуть ниже.