Начало 2024 года. У меня на руках демка игры, над которой я работал последние полгода. Ещё год назад я занимался разработкой мобильных приложений и сидел на хорошей зарплате, а сейчас я безработный инди-разработчик! Но как так вышло?

I have a dream... У меня конечно нет точной статистики, но я абсолютно уверен, что количество людей, которые связали свою жизнь с айти сферой началось с детского наивного: «хочу делать игры!». Я не был исключением.
В очередной раз закрывая таску по добавлению экрана в мобильное приложение я задумался: а ведь совсем не этого я хотел в детстве. Я хотел участвовать в создании миров, а не каждый день отчитываться какие таски их джиры закрыл вчера, а какие буду закрывать сегодня. Я понял, что нужно что-то менять.
Прошлый опыт - работа над ошибками

Разумеется, в прошлом у меня не раз был «опыт» создания игр, хотя использовать именно такую формулировку язык не повернётся. Увы (или к счастью), скриншотов, а тем более каких‑либо файлов из тех проектов не сохранилось. Большинство из них в принципе не были доведены до конца. И это не удивительно! Работа велась максимально хаотично, многие очень важные сферы игнорировались (геймдизайн, маркетинг), а флагом об окончании проекта служило не достижение определённого уровня качества или функционала, а куда более сакральные причины вроде: «надоело» и «я придумал идею интереснее».
Сейчас же у меня есть немалый опыт работы, который научил меня, что это не самые лучшие маркеры того, что стоит завершать работу над проектом. Более того, годы размышлений и работы в айти сфере привели меня к очень важному инсайту: «хочу сделать крутую игру, где нужно бегать и сражаться со всеми» — не является геймдизайном, а «сначала найду картинки, потом напишу код и добавлю в игру музыку, а потом выложу игру и все будут в неё играть, потому что она крутая!» — не является планом действий. Соглашусь, что в этом есть какой‑то задор и боевой дух, но если проектом предстоит заниматься не 1–2 дня, то с таким планом далеко не уйдёшь.
Следует с самого начала создать какой‑то план. Не обязательно сильно строгий и подробный, но на каждом его этапе декомпозировать процесс и анализировать свои действия. В результате вышло что‑то в таком стиле:
Идея
На момент, когда я оказался здесь, у меня уже была идея. Хотелось сделать эдакий рогалик для программистов. Осознание того, что управлять персонажем в экшн игре через код может оказаться чересчур сложным, да и в принципе не будет создавать тот самый заветный фан, подсказывало, что перед переходом к полноценной разработке эта идея, как никакая другая, требует проверки жизнеспособности.
Подготовительный процесс
Но первым делом нужно было определиться с инструментами работы. Мне так или иначе предстоит изучить довольно много новой информации, что займёт немало времени, идея срезать углы там, где это можно было сделать без потерь в качестве показалась мне разумной. Таким образом пришло однозначное решение, что игра будет на пиксельной графике с topdown камерой. Существует немалое количество хейтеров пиксельной графики, однако киллер фича игры — не в этом. И, если кому‑то она не понравится из‑за того, что: «фууу, пиксели!», то мне же спокойнее без такого комьюнити.
Далее — выбор инструментов для работы.
Если для создания графики довольно быстро я пришёл к такому решению, как Piskel (бесплатный, опенсорсный и довольно простой проект, который покрывает все мои хотелки), а для работы со звуком не колеблясь я выбрал Reaper, то с основным инструментом разработки было куда больше сложностей и сомнений. Мой прошлый опыт включал в себя в основном работу на Unity (а как иначе же?), но что‑то меня отталкивало в нём.
Я решил проанализировать минусы и плюсы платформы лично для себя и вот что получилось.
Плюсы:
-
Наличие пусть и небольшого, но опыта.
-
Огромное количество обучающего материала и примеров кода.
-
Куча решений «из коробки».
Минусы:
-
Мне не нравится C#. По работе я использовал в основном Java (а после — Kotlin), из-за чего C# мне казался «не правильным».
-
Негативный опыт работы в прошлом.
-
Субъективно перегруженный интерфейс — не хочу видеть столько информации сразу и прыгать между графическим и кодовым редактором.
-
Наличие платной подписки.
Игра подразумевала создание своей «IDE» и «языка программирования». Этот инструмент в целом казался неудобным для этой цели. Какие альтернативы у меня есть? В прошлом я имел опыт работы с libGDX на Java, но опять же после Kotlin мне и Java казалась не очень удобной, я уже молчу о том, что не хотелось в принципе делать игру на JVM, хотя концепция code-only подхода в этом вопросе мне нравилась. Именно за неё я ухватился. Были мысли попробовать что-нибудь, для чего требуется C++ - ведь это, по сути, золотой стандарт разработки игр. Но с этим языком у меня не так много опыта, поэтому в добавок к хорошему перформансу я рисковал получить огромное количество багов и проблем, которые очень сильно замедлят меня. Тогда я обратил внимание на хорошую альтернативу в плане перформанса, но куда более безопасную и programmer-friendly - Rust. Не сказать, что я был сильно квалифицирован в этой схеме, но поверхностно с языком был знаком. А остальное - как в анекдоте:
«Методичка есть? Тогда сейчас докурю, и пойду сдавать.»
Проведя немного времени в гугле и ютубе, я открыл для себя Bevy, который так же решил проанализировать и вот к чему я пришёл:
Плюсы:
-
Бесплатный
-
Отсутствие GUI
-
Дружелюбное комьюнити, которое всегда готово ответить на вопросы
-
Rust
-
Опенсорсный. А так же большое количество библиотек от комьюнити, которые можно модифицировать под свои нужды.
Минусы:
-
Плавающее апи (в результате обновления версии может потребоваться переписывать некоторые части кода)
-
Не так много обучающих материалов. Хотя это не критично, так помимо поведения самого движка и WebGL, уроки мне и не нужны.
-
Абсолютно незнакомый стек для меня. Плюсы показались более значительными, но я всё равно решил разработать небольшой тестовый проект на пару недель. В результате я осознал, что это решение мне прекрасно подходит и приступил к следующему этапу.
Proof of concept
Для того, чтобы понять, что игра вообще будет работать (вызывать фан, желание залипнуть в неё и обсуждать её с другими), мне стоило убедиться, что она понравится хотя бы мне. Не лишним будет и мнение других людей, но обязательно как-то связанных с программированием, т.к. на этом этапе обучения не было и в помине.
По мере разработки я набивал шишки в Bevy и всё лучше начинал понимать философию языка Rust, попутно всё больше влюбляясь в обе технологии. Игру с самого начала захотелось пропитать хакерской и киберпанковской эстетикой (зелёный текст, подходящий саундтрек и SFX, пасхалки). Но без фанатизма: на этом этапе самое важное посмотреть насколько идея способна жить.
В тот момент, когда я заставил персонажа ходить, введя команду move(10,0)
, я был в восторге! Восторг был скорее восторгом разработчика, нежели игрока, однако это была та самая детская эмоция, которая сделала пробила мне дорогу в айти сферу. Далее я реализовал несколько основных команд и два вида противников. Тестируя игру какое-то время мне стало очень душно постоянно вводить команды ради каждого действия, из-за чего идея уже начала мне казаться чрезмерно замороченной, не стоящей вложения сил, но я продолжал свой путь по чеклисту разработки прототипа. Попутно я добавил крайне важные на мой взгляд функции истории прошлого ввода и систему автодополнения на Tab, которые слегка понизили градус душноты, но всё ещё было что-то не то.

Как вдруг произошло оно! Я закончил функционал базовой IDE и теперь в игре можно было создавать свои функции. Пусть и довольно примитивные, багованные и ограниченные. В этот момент мой игровой опыт изменился. В геймдизайн вклинилась награда за страдания и поощрение креативности: теперь, проанализировав своё поведение можно было автоматизировать некоторые простые действия, что сильно упрощало игровой процесс и давало ощущение того, что ты своей находчивостью смог сделать себе игру проще.
Я скинул демку нескольким своим товарищам и они разделили со мной это чувство. Тогда я осознал, что мне стоит продолжать.
Разработка
Прототип готов! Теперь дело за малым, верно?
С самого начала я понимал, что не стоит тешить себя надеждами на то, что дело пойдёт быстро. Мне предстояло занимать не только написанием кода, но и планированием, дизайном, а так же маркетингом. Строгих сроков я себе не ставил, но работать старался практически каждый день.
Прогрессируя по мере разработки я начал сталкиваться с проблемами, которые были вызваны недостатком опыта. Архитектура местами была слишком неудачной, из-за чего периодически приходилось возвращаться к старым решениям и переписывать их более чистым способом. К слову, это не был чистый код ради чистого кода. На данный момент в проекте ещё остались некоторые «чёрные ящики», которые просто работают. Я их не трогаю: не вижу в этом смысла, т.к. затраченное врем я абсолютно того не стоит. То, что я исправлял, обычно сильно ускоряло последующую разработку. В свою очередь, некоторые фичи, которые я реализовывал, были бы сплошным набором костылей без таких исправлений. Поэтому я относился к этому процессу довольно спокойно.
По мере работы мой бэклог продолжал расти. С самого начала было понятно, что ресурсы мои ограничены и пытаться сделать ААА проект - крайне глупая затея, поэтому я начал выделять для себя 3 группы тасок:
-
Багфикс
-
Фичи
-
То, что реализую, но когда-нибудь потом (когда в игру будет играть очень много людей и всё будет классно и чудесно).
Таким образом я вроде бы и не ограничивал себя в фантазиях, но при этом осознавал, что это «когда‑нибудь» скорее всего не наступит, поэтому можно спокойно сосредоточиться на довольно приземлённом бэклоге.
Что дальше?

Впереди ещё очень много работы, даже чтобы покрыть первые две группы тасок.
Однозначно это займёт ещё минимум полгода. Все процессы разработки удалось полностью интегрировать в повседневную жизнь, из‑за чего процесс стал для меня рутиной (в хорошем смысле слова). Пожалуй, на этом закончу эту статью, но не историю. Я планирую сделать несколько статей по этой теме, в которых так же планирую:
-
Рассказать про особенности игры и её философию.
-
Описать дальнейшие планы по разработке.
-
Показать примеры кода и рассказать про трудности, с которыми я сталкивался и как их решал.
-
Какие маркетинговые стратегии я использовал и использую?
-
Как я не сошёл с ума, работая один?
-
Как я создавал для себя продуктивную среду.
Автор:
fellow_pablo