DEPO | Пишем "альфу" игры TwoCars - процедурная генерация

DEPO | Пишем "альфу" игры TwoCars - процедурная генерация

"TwoCars" - мобильная игра, геймплей которой состоит из управления двумя автомобилями одновременно - необходимо объезжать препятствия и собирать монетки. Оригинальная "2Cars" была создана студией "KetchApp", которая стабильно выдаёт хиты в области мобильного гейминга, например, именно они создали "Stack", самую популярную версию "2048" и конечно же "Stick Hero" - именно на эту студию я и стал ровняться, создавая DEPO.

Однако "2Cars" - не самая их популярная игра, но одна из самых интересных с точки зрения разработки. Чем интересна? - Буквально всем, и сегодня я расскажу, как я реализовал основную механику игры с помощью процедурной генерации (это не ААА проект, поэтому её уровень будет пропорционален масштабу игры). Чтобы было понятно, что есть что - вот рабочий скрин прототипа:

​Экран игры, синие машины (это машины игрока) и препятствия, которые нужно объезжать (куст, камень и машины других цветов). Кузин Павел
​Экран игры, синие машины (это машины игрока) и препятствия, которые нужно объезжать (куст, камень и машины других цветов). Кузин Павел

Влево-вправо-объезжаю

Чтобы объехать препятствие необходимо перестроиться на соседнюю полосу, нажав на, соответсвенно, левую или правую часть экрана. Варианта реализации перемещения было два: (1) создав две невидимые кнопки, после нажатия на которые движение бы и происходило. У данного метода есть один большой минус - при игре на iPad кнопки нужно было бы дополнительно увеличивать, возможно с помощью закрепления их с помощью "Constraints" (ограничений), но этим инструментом я пока не владею. (2) Вторым методом, которым я в итоге и воспользовался, было разделение экрана на две игровые области, то есть, мы берем ширину экрана и делим её на 2 - ближняя к нулю координат половина отвечает за перемещение левой машинки, а дальняя - правой.

Реализация движения.​ ​Кузин Павел
Реализация движения.​ ​Кузин Павел

Если вы понимаете в программировании, то заметили, что нажатие на часть экрана позволяет машинке двинуться или не позволяет (в зависимости от true или false соответсвенно). Да, это так. Более того, машинка передвигается между двумя заранее известными точками - по игре это левая и правая полоса дороги, которые описаны в коде как "длина экрана устройства, поделенная на 4 части". В общем-то всё, машинки двигаются вправо-влево, но необходимо имитировать движение прямо и создать препятствия, в этом то и поможет процедурная генерация.

Примитивная PCG для примитивной игры

Процедурная генерация (с англ. procedural generation, сокр. PCG) — автоматическое создание игрового контента с помощью алгоритмов.

Julian Togelius
, Автор книги "Что такое процедурная генерация? Марио на границе

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

Метод создающий разметку для левой и правой машины.​ Кузин Павел
Метод создающий разметку для левой и правой машины.​ Кузин Павел

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

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

Не знаю, как с этой проблемой справились в студии KetchApp, но мы решили решить эту проблему с помощью обыкновенного таймера, то есть в рандомное время, например от секунды до двух секунд, на экране должно появиться новое препятствие в одном (или двух) из четырёх мест. Какой объект должен появиться, также выбирается рандомно - у нас всего 4 уникальных препятствия, поэтому надо выбрать число от 1...4. В нашем случае 1...8 только потому, что сначала планировалось 8 объектов, но дорисовать решили позже

Рандооооом​: вначале выбирается препятствие, затем - его местоположение Кузин Павел
Рандооооом​: вначале выбирается препятствие, затем - его местоположение Кузин Павел

Заключение

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

1717
24 комментария

Компания KetchApp не создаёт игры, она издаёт игры от сторонних разработчиков. 
У неё две задачи:
- выбрать из потока предложений потенциальный хит 
- раскрутить игру, используя свои возможности по рекламе 

5
Ответить

Комментарий недоступен

Ответить

Комментарий недоступен

2
Ответить

Члены трущиеся друг о друга и тэг лгбт это успех.

8
Ответить

Дело не в обёртке, а в поэтапном повторении технологии - в первом посте про Депо я написал, что главное - научиться) Это как в школе искусств, сначала ты срисовываешь с натуры, чтобы потом из головы нарисовать персонажа.

Этого клона не будет в AppStore - это как минимум не круто. Обертка либо будет изменена, либо механика уйдёт в другие проекты)

1
Ответить

Комментарий недоступен

1
Ответить

Threes делала игру на сложение чисел вроде, а 2048 изначально была написана Габриэле Чирулли и он открыл код. Получается KetchApp сделал самую популярную версию 2048 - я исправил)

Ответить