BoxRob. Загрузи ящики в грузовик

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

В этой статье хочу рассказать о разработке игры BoxRob для студии 7 Spot Games. Игра делалась для платформы poki.com на движке defold.

BoxRob. Загрузи ящики в грузовик

Часть 1 Знакомство

Меня зовут Дима(d954mas). Около 5 лет работаю в геймдеве, программистом. Сейчас занимаюсь разработкой своих игр и фрилансом. До этого всегда работал в компаниях, это мой первый проект как фриланс разработчика. И первый проект где пришлось много работать с 2д физикой.

С 7 Spot Games я познакомился интересным образом. Я зарегистрировался на форуме most.place для игровых разработчиков и в описании написал про свой опыт и defold. Через некоторое время Алексей из 7 Spot Games написал мне и мы договорились пообщаться. Он мне рассказал про идею игры, и предложил ее сделать. Мне понравилось его предложение и с 3-его мая я приступил к разработке.

На разработку ушло 4.5 месяца, честно говоря я думал получится быстрее, но получилось как всегда:)

03.05.2021-Первый коммит.

07.05.2021-Загрузка уровня из tiled + физика

17.07.2021 - Полностью готовый прототип. Уровни можно пройти.

22.09.2021 - Много полировки. Ушла в poki, на софт ланч.

Часть 2 Инструменты разработки.

Немного про инструменты, разработку, и коммуникации.

Defold - кроссплатформенный движок с открытым исходным кодом. Движок сфокусирован на 2D, немного умеет в 3D.Отлично чувствует себя в вебе(wasm + webGL)

У меня большой опыт работы с defold. Я им пользуюсь 5 лет, с момента его публичного релиза. Для своих прототипов, для джемов, из коммерческих проектов делал на нем игру для умных колонок(веб билд).

Движок мне очень нравится, он прекрасно подходит для создания 2D игр. Вот тут про мои проекты на движке, можно узнать подробнее: https://github.com/d954mas/defold-d954mas/blob/master/README.md

BoxRob. Загрузи ящики в грузовик

Для физики используется известный физический движок box2d. В defold уже встроена версия box2d. Но доступен ограниченный функционал. К счастью из движка можно выкинуть стандартную физику и с помощью нативного расширения, добавить полноценную физику, в которой будет доступно все. Нативное расширение пишется на С++.

Если в движок добавлено такое расширение, то сборка движка происходит в облаке. Никакой войны с настройками, компиляторами, зависимостями и прочими штуками на твоей машине, кайф.

Для физики уже было готовое нативное расширение box2d (https://github.com/Lerg/extension-box2d) В этом расширении реализован минимальный набор методов, но новые методы легко было добавить, и был полный контроль над апдейтом физики.

Для создания уровней используется Tiled. Tiled — кроссплатформенный открытый редактор тайловых карт для игр.

В принципе возможно собирать уровни и в самом движке, но я считаю Tiled более удобным и гибким для данной цели. Из tiled уровни выгружаются в .lua. Обычный экспорт сильно избыточен, поэтому .lua файлы, конвертируются скриптом в .json. Скрипт выкидывает лишнее, делает некоторые правки(например меняет систему координат с y-down на y-up) и выполняет валидацию(на уровне есть точка спавна игрока,лифты ссылаются на существующую траекторию, нет объектов с одинаковым именем и тд)

BoxRob. Загрузи ящики в грузовик

Немного про разработку.Мне очень нравится дата ориентированный подход в разработке, а в частности ecs. Не буду тут сильно углубляться что такое ecs(entity component system), тк это тема отдельной статьи. Если очень кратко то это паттерн для декомпозиции.

Суть его в том что каждый игровой объект(entity) состоит из набора компонентов(component). Например component позиции, component ускорения и тд.

А вся логика пишется в system. Например system перемещения, берет все entity у которых есть component позиции и component ускорения, и выполняет с ними нужные операции. Подробнее можно почитать тут: https://www.gamedev.net/articles/programming/general-and-gameplay-programming/understanding-component-entity-systems-r3013/

В итоге в игре есть 44 системы, и еще больше компонентов.

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

BoxRob. Загрузи ящики в грузовик

Про команду и коммуникацию. В команде опытные люди, с которыми мы сработались и было легко работать. Я занимался всем кодом и дизайном уровней. От остальных фидбек, задачи, арт и звуки.

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

Часть 3 Прототип

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

Вначале был подключен tiled, тк нужен был уровень, по которому будет ездить робот.

Потом подключилась физика, и началось создание робота. При работе с физикой сильно помогла документация box2d ну и конечно гугл, и различные туториалы для box2d.

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

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

В итоге то как ведет себя робот в релизной версии это набор физических тел и их свойств, которые был подобран за счет большого количества итераций:)

Этап 1. (11.05)

Колесная база.

Этап 2.(18.05)

Обновился арт. Робот научилась прыгать. Появилась рука. Это физический прямоугольник который всегда под определенным углом к колесной базе. И при переворотах базы, сохраняет нужный угол.

Этап 3.(24.05)

Рука это набор физических тел. Рука двигается. При контакте с ящиком, он присоединяется к руке.

Этап 4.(7.06)

Сильно увеличилась проходимость. Рука может взять ящик и ездить с ним. При смене направления движения рука разворачивается.

Этап 5.(09.06)

Первый вариант кидания ящика. Замах рукой и бросок. Изначально у игрока была возможность прицеливаться, от которой мы в итоге отказались)

Этап 6.(10.06)

Второй вариант кидания ящика. Стрельба ящиком. Этот вариант, без возможности прицеливаться вошел в игру

Этап 7(17.07)

Законченный прототип.Все механики работают.Можно пройти уровень от старта до появления экрана победы.

Часть 4 Интересные моменты

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

Поэтому расскажу о некоторых интересных или забавных моментах, в разработке.

1)Размер игры

Суммарный размер игры: 5.58 Мб / 3.61 Мб(gzipped)

BoxRob. Загрузи ящики в грузовик

Из которых 2.91Мб ресурсы:

  • 1.33 Мб музыка и звуки
  • 1.20 Мб текстуры
  • 216.20 Кб скрипты
  • 63.21 Кб шрифты
  • 46.65 Кб уровни(json)

Все остальное это движок + экран загрузки.

Достигли этого за счет настройки сжатия текстур, сжатия звуков и музыки в audacity(ogg), использованием webp вместо png для экрана загрузки, выкидыванием из движка неиспользуемых модулей(встроенной физики) и тд.

2)Круглые ящики

Ящик при взятии в руку меняет физическое тело с прямоугольника на шар, таким образом, он не застревает в узких проходах,и не цепляется за углы:)

BoxRob. Загрузи ящики в грузовик

3)Положить ящик.

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

4)Ящики в грузовике.

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

5)Невидимые стены

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

Но возникла новая проблема, робот мог заехать в этот проход. Поэтому пришлось добавить невидимую стенку, которая коллайдит только с роботом)

Желтый это коллайдер стены. Красная это невидимая стена.

BoxRob. Загрузи ящики в грузовик

6)Бонусный уровень.

При прохождении всех уровней на 3 звезды, открывается бонусный уровень.

В бонусном уровне не нужно доставлять ящики, нужно успеть собрать все звезды, за определенное время. Но игра ожидает, что на уровне будет стоять грузовик. Поэтому на бонусном уровне, есть грузовик, но он за пределами видимости игрока:)

BoxRob. Загрузи ящики в грузовик

7)Баги с физикой.

Баги с физикой могут выглядеть забавно. Например когда руку робота разрывает на части, но она пытается собраться обратно)

Заключение.

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

На этом все, спасибо что прочитали:)

4343
18 комментариев

Племянник помню ещё в 2010-2012 в такую же флеш игру играл

9
Ответить

Причём я смотрю и ассеты точно такие же

4
Ответить

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

3
Ответить

Это клон флэш-серии Truck Loader, только на дефолде?

1
Ответить

Truck Loader - это серия игр, которую делал на флеше Алексей Flazm Давыдов. Но эпоха флеш-игр прошла, и в те игры уже не поиграть. Поэтому Flazm ("Алексей" из статьи) - решил обновить графику, уровни и выпустить игру на html5.
То есть здесь нет клонирования. Flazm развивает свои же игры и выпускает на новой технологии. Дима занимался технической частью и левелдизайном.

7
Ответить

Не совсем клон) Тут другая машина и рука по другому работает)

2
Ответить

Спасибо за статью и опыт, очень интересно! 🤗

3
Ответить