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 объектов, но дорисовать решили позже

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

Заключение

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

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Паша Кузин", "author_type": "self", "tags": ["\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430","\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0430\u044f","\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u0430\u044f\u0438\u0433\u0440\u0430","\u043c\u0435\u0445\u0430\u043d\u0438","\u043b\u043e\u043d\u0433\u0440\u0438\u0434","\u0438\u043d\u0434\u0438","\u0434\u043b\u0438\u043d\u043d\u043e\u043f\u043e\u0441\u0442","\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f","\u0430\u043b\u044c\u0444\u0430","development","depo"], "comments": 24, "likes": 3, "favorites": 13, "is_advertisement": false, "subsite_label": "indie", "id": 77684, "is_wide": false, "is_ugc": true, "date": "Sun, 27 Oct 2019 00:29:46 +0300", "is_special": false }
0
24 комментария
Популярные
По порядку
Написать комментарий...
5

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

Ответить
0

И она является дочерней компанией Ubisoft, просто ещё один интересный факт о ней.

Ответить
0

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

Ответить
0

Разве Ubisoft не была до этого на мобильном рынке Gameloft? (Или я что-то путаю)

Ответить

Персональный хичхакер

2

Если уж делать клон чужой игры, может хоть с фантазией подойти к процессу?
Бесплатные идеи:
Лимфоциты в кровеносных сосудах, уворачиваются от эритроцитов, ловят вирусы\бактерии.
Сноубордисты уворачиваются от камней\елок, собирают флажки.
Байдарки на горной речке, уворачиваются от камней.
Свернутые банкноты, собирают дорожки, уклоняются от окурков.
Акулы, уклоняются от рифов, жрут рыбок.

Ответить
8

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

Ответить

Персональный хичхакер

hede
1

Ну это стопудовая идея для успеха, не стоит такие раздавать бесплатно!

Ответить
3

Я публично запатентовал с помощью дтф.

Ответить
0

Потом марвел фильм по мотивам снимет

Ответить
1

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

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

Ответить

Персональный хичхакер

Паша
0

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

Лол, рисование с натуры и срисовка - разные вещи.
Но дело ваше.

Ответить
0

ну я имел ввиду повторение фигуры - сорян выразился не так, надеюсь мысль понятна

Ответить
0

 чтобы потом из головы нарисовать персонажа.

Нормальный художник не рисует "из головы", всегда использует референсы. 

Ответить
1

оригинальную "2048" 

Ты похоже не в курсе про "Threes"

Ответить
0

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

Ответить
0

Комментатора классно подколол ))) остроумие = 100%

Ответить
0

Мобилки + процедурная генерация. Уже бинго или чего забыли?

Ответить
0

матч3

Ответить

Нижний Влад

0

Мама я в т̶е̶л̶е̶в̶и̶з̶о̶р̶е DTF! 

Ответить
0

Почему выбор пал на SpriteKit, а не на кроссплатформенные решения?
И если не планируете выкладывать в стор игру, то может хоть ее исходники выложите на гитхаб? Может кому-то будет полезно.

Ответить
0

Да, так и будет

Ответить
0

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

Ответить
0

Не очень понял: писать только по законченному проекту, а не писать по каждому этапу? Хороший подход, но я начал писать только для собственной мотивации что-то писать и учиться. Для начинающих это может стать (1 и самое главное) мотивацией (2) хорошим подходом, ведь они будут понимать как реализуется тот или иной подход

Ответить
0

В общем целом да, и лучше разбирайте чужой код которого валом по запросу "car top down scroll game source code", нет никакого смысла его переписывать. А еще лучше возьмите нормальный проект, нормальной опенсорсной игры с исходниками, на десятки и сотни тысяч строк и разбирайте его, вы и сами многому научитесь и пользы будет больше, глядишь репозиторий пополните каким-то полезным фиксом или реализацией которая работает лучше чем оригинал, за одно познакомитесь с действительно "боевым" кодом и окружением для сборки реального проекта. А не вот этой игрушечной хренотой. Ну и соответственно у вас будут нормальные лонги если еще и конспектировать это будете.

Ответить

Прямой эфир

{ "jsPath": "/static/build/dtf.ru/specials/DeliveryCheats/js/all.min.js?v=05.02.2020", "cssPath": "/static/build/dtf.ru/specials/DeliveryCheats/styles/all.min.css?v=05.02.2020", "fontsPath": "https://fonts.googleapis.com/css?family=Roboto+Mono:400,700,700i&subset=cyrillic" }