Изображение из демо-версии игры
Изображение из демо-версии игры

14 месяцев назад я начал разрабатывать гонку под названием beaterCore. Идея была простой — с дедлайном 4 месяца сделать простую игру без пафоса. Ну, любой разработчик знает, что произошло дальше: без пафоса не вышло.

Истоки

У меня есть глупый принцип — делать как можно больше задач самостоятельно. Этот принцип применяется и к игровым движкам: я их не использую. Давным-давно попробовал делать игры с нуля на языке Rust и с тех пор упорно продолжаю. Каждый год что‑то новое, первым проектом был чат для VR шлемов, потом космосим... 3 космосима. И вот сейчас гонка.

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

Было решено сделать комбат‑рейсер с элементами ремонта автомобилей. Чтобы сделать моего единорога, двигатель и трансмиссия должны были симулироваться относительно реалистично (присуствовало бы сцепление, переключение передач, кривая момента у двигателя), а покрышки — относительно аркадно.

В основе «ядра» гонки встал как раз-таки заброшенный космосим, от него перешел простой рендер на API Vulkan и редактор уровней, а также система ввода, звука, и общая организация проекта.

Редактор уровней в космосиме
Редактор уровней в космосиме

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

"Чистое" ядро без космоса
«Чистое» ядро без космоса

А через неделю, когда я только-только вник в основы симуляции покрышек, у меня по сцене уже ездила машинка.

«Чистое» ядро без космоса

Отдельно про шины

Кто бы мог подумать, что симуляция шин будет сложной? Ведь цель‑то — сделать просто!
Было решено использовать модель динамики шин Ханса Б. Пасейки. Эту модель использует большая часть гонок, кроме совсем серьезных симуляторов.

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

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

Графика. Формирование внешнего вида игры

Ранняя вариация стиля игры
Ранняя вариация стиля игры

Графика игры развивалась по мере развития моих собственных способностей. В начале тематика игры крутилась вокруг пустынь и чего‑то постапокалиптического, вроде серий игр motorstorm, но в конце органически пустыни поменялись на леса и избушки.

Первая версия автомобиля ZAM Zap
Первая версия автомобиля ZAM Zap
Ранняя версия похожая на итоговою
Ранняя версия похожая на итоговою
Внешний вид игры на данный момент
Внешний вид игры на данный момент

Развитие игры. Сложность создания игровых механик

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

Вместе с одиночной кампанией родилась и основная тематика игры — ремонт автомобилей. Далее появилась и экономика, игроку нужно зарабатывать деньги с гонок, чтобы себе его позволить. Элементы комбат‑рейсинга были забыты. На бумаге все просто — на практике продумывать, как и что будет делать игрок, оказалось тяжелой задачей.

Первая версия главного меню игры
Первая версия главного меню игры
Итоговая версия главного меню игры
Итоговая версия главного меню игры

В момент разработки я играл в Neon White, и мне очень понравилось оформление главного меню игры в виде карты города с локациями, которые можно посетить. Клянусь, я не копировал Gran Turismo! Быстро появилась идея с гаражом, где игрок бы чинил свой автомобиль, магазином автозапчастей, дилером и свалкой старых автомобилей (которая сейчас лишь в планах). В первом прототипе можно заметить, что вместо дилера стоит парк, в нем игроку планировалось встречать квестовых персонажей — увы, тоже идея, которая не дожила до текущей версии игры.

Ранняя версия гаража
Ранняя версия гаража

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

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

Сетевая игра

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

Лобби в сетевой игре
Лобби в сетевой игре

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

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

При выпуске игры в Steam также пришлось добавить поддержку Steam Networking Sockets, для простых людей — возможность пригласить друга в игру через клиент Steam без необходимости открывать порты. Хочу отметить мой исключительно позитивный опыт с Steam SDK, разработчикам, планирующим добавить сетевую игру в свои проекты, могу смело сказать, что боятся его не нужно.

API Vulkan — не для слабых. Я понял, что я слаб

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

Во‑первых, разработка любой фичи, связанной с графикой, занимала в 10 раз больше времени. Физически больше нужно писать кода, куда больше пространства для ошибок. Во-вторых, я постоянно натыкался на проблемы, возникающие только на определенном железе. Если все работает хорошо на NVidia — далеко не факт, что код будет функционировать на картах Intel или AMD. И даже если код работает на одной видеокарте AMD — не факт, что он будет работать на другой.

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

В итоге за 3 дня перевел всю графику на OpenGL и забыл Vulkan, как страшный сон. Хотя в будущем, возможно, постараюсь вернуть его опционально.

Выпуск демо-версии на itch.io

До выпуска демо‑версии в Steam я выложил игру на itch.io. Игра не получила широкой огласки, и на момент написания статьи имеет 370 загрузок. Но польза определенно была — решение перевести игру на OpenGL было принято как раз после выпуска на itch.

График просмотров и загрузок на itch.io  Заметно, что в первую неделю было больше всего трафика, релиз демо-версии в Steam 5 февраля никак не повлиял на количество загрузок
График просмо��ров и загрузок на itch.io Заметно, что в первую неделю было больше всего трафика, релиз демо-версии в Steam 5 февраля никак не повлиял на количество загрузок

Выпуск демо-версии в Steam

Для выпуска демо‑версии в Steam нужна была страница. Для начала нужно заплатить пошлину в 100$, это даст возможность получить доступ к личному кабинету разработчика, где можно начать оформление страницы.

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

Страницу в магазине я выложил в публику в тот же день, как и выпустил демо-версию на itch. А вот демо-версию в Steam я выпустил уже через 3 месяца, когда был уверен, что игра находится в достойном для этого виде.

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

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

Про Rust

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

Мне он просто нравится. Я пишу игры на Расте уже 10 лет и своими глазами видел развитие экосистемы.

Мне нравится, что мой код работает на всех платформах без модификаций. Мне очень нравятся библиотеки и их авторы. Отдельное спасибо Ralith за библиотеку hecs (ECS система), SamiP за fundsp (звук, высокий уровень), а также спасибо всем, кто участвует в разработке библиотек gilrs (ввод), cpal (звук, низкий уровень), разработчикам nalgebra и parry (математика и коллизия), и многим другим( полный список используемых библиотек можно узнать, скачав игру и посмотрев файл THIRDPARTY_LICENSES).

Заключение

Соло-разработка игр — тяжелая работа. При разработке ��роекта я не использовал игровой движок, и как можно заметить, остался жив, и игра даже функционирует.

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