Начало 2024 года. У меня на руках демка игры, над которой я работал последние полгода. Ещё год назад я занимался разработкой мобильных приложений и сидел на хорошей зарплате, а сейчас я безработный инди-разработчик! Но как так вышло?
![Заветная страница в Steam Заветная страница в Steam](https://habrastorage.org/getpro/habr/upload_files/877/a32/0da/877a320dae31a0c98441bc5757d9cca9.png)
I have a dream... У меня конечно нет точной статистики, но я абсолютно уверен, что количество людей, которые связали свою жизнь с айти сферой началось с детского наивного: «хочу делать игры!». Я не был исключением.
В очередной раз закрывая таску по добавлению экрана в мобильное приложение я задумался: а ведь совсем не этого я хотел в детстве. Я хотел участвовать в создании миров, а не каждый день отчитываться какие таски их джиры закрыл вчера, а какие буду закрывать сегодня. Я понял, что нужно что-то менять.
Прошлый опыт - работа над ошибками
![Так Fusion Brain видит процесс подготовки Так Fusion Brain видит процесс подготовки](https://habrastorage.org/getpro/habr/upload_files/e8e/bdb/81b/e8ebdb81b9b1d841b9a7b8e7c82a0a2d.png)
Разумеется, в прошлом у меня не раз был «опыт» создания игр, хотя использовать именно такую формулировку язык не повернётся. Увы (или к счастью), скриншотов, а тем более каких‑либо файлов из тех проектов не сохранилось. Большинство из них в принципе не были доведены до конца. И это не удивительно! Работа велась максимально хаотично, многие очень важные сферы игнорировались (геймдизайн, маркетинг), а флагом об окончании проекта служило не достижение определённого уровня качества или функционала, а куда более сакральные причины вроде: «надоело» и «я придумал идею интереснее».
Сейчас же у меня есть немалый опыт работы, который научил меня, что это не самые лучшие маркеры того, что стоит завершать работу над проектом. Более того, годы размышлений и работы в айти сфере привели меня к очень важному инсайту: «хочу сделать крутую игру, где нужно бегать и сражаться со всеми» — не является геймдизайном, а «сначала найду картинки, потом напишу код и добавлю в игру музыку, а потом выложу игру и все будут в неё играть, потому что она крутая!» — не является планом действий. Соглашусь, что в этом есть какой‑то задор и боевой дух, но если проектом предстоит заниматься не 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, которые слегка понизили градус душноты, но всё ещё было что-то не то.
![Скринов первого прототипа с ассетами из интернета нет. Вот чуть более поздняя версия. Скринов первого прототипа с ассетами из интернета нет. Вот чуть более поздняя версия.](https://habrastorage.org/getpro/habr/upload_files/baa/b78/29f/baab7829f6840bd06f4379477f849b47.png)
Как вдруг произошло оно! Я закончил функционал базовой IDE и теперь в игре можно было создавать свои функции. Пусть и довольно примитивные, багованные и ограниченные. В этот момент мой игровой опыт изменился. В геймдизайн вклинилась награда за страдания и поощрение креативности: теперь, проанализировав своё поведение можно было автоматизировать некоторые простые действия, что сильно упрощало игровой процесс и давало ощущение того, что ты своей находчивостью смог сделать себе игру проще.
Я скинул демку нескольким своим товарищам и они разделили со мной это чувство. Тогда я осознал, что мне стоит продолжать.
Разработка
Прототип готов! Теперь дело за малым, верно?
С самого начала я понимал, что не стоит тешить себя надеждами на то, что дело пойдёт быстро. Мне предстояло занимать не только написанием кода, но и планированием, дизайном, а так же маркетингом. Строгих сроков я себе не ставил, но работать старался практически каждый день.
Прогрессируя по мере разработки я начал сталкиваться с проблемами, которые были вызваны недостатком опыта. Архитектура местами была слишком неудачной, из-за чего периодически приходилось возвращаться к старым решениям и переписывать их более чистым способом. К слову, это не был чистый код ради чистого кода. На данный момент в проекте ещё остались некоторые «чёрные ящики», которые просто работают. Я их не трогаю: не вижу в этом смысла, т.к. затраченное врем я абсолютно того не стоит. То, что я исправлял, обычно сильно ускоряло последующую разработку. В свою очередь, некоторые фичи, которые я реализовывал, были бы сплошным набором костылей без таких исправлений. Поэтому я относился к этому процессу довольно спокойно.
По мере работы мой бэклог продолжал расти. С самого начала было понятно, что ресурсы мои ограничены и пытаться сделать ААА проект - крайне глупая затея, поэтому я начал выделять для себя 3 группы тасок:
Багфикс
Фичи
То, что реализую, но когда-нибудь потом (когда в игру будет играть очень много людей и всё будет классно и чудесно).
Таким образом я вроде бы и не ограничивал себя в фантазиях, но при этом осознавал, что это «когда‑нибудь» скорее всего не наступит, поэтому можно спокойно сосредоточиться на довольно приземлённом бэклоге.
Что дальше?
![Так игра выглядит сейчас Так игра выглядит сейчас](https://habrastorage.org/getpro/habr/upload_files/b66/6e3/762/b666e376226dfe51876923987fd0822e.png)
Впереди ещё очень много работы, даже чтобы покрыть первые две группы тасок.
Однозначно это займёт ещё минимум полгода. Все процессы разработки удалось полностью интегрировать в повседневную жизнь, из‑за чего процесс стал для меня рутиной (в хорошем смысле слова). Пожалуй, на этом закончу эту статью, но не историю. Я планирую сделать несколько статей по этой теме, в которых так же планирую:
Рассказать про особенности игры и её философию.
Описать дальнейшие планы по разработке.
Показать примеры кода и рассказать про трудности, с которыми я сталкивался и как их решал.
Какие маркетинговые стратегии я использовал и использую?
Как я не сошёл с ума, работая один?
Как я создавал для себя продуктивную среду.
Комментарии (20)
vassabi
05.01.2024 09:51+10ну, делать игру, чтобы изучить новый язык программирования - это круто! :)
fellow_pablo Автор
05.01.2024 09:51+4Совмещать приятное с полезным) Куда интереснее, чем CRUDы клепать
feelamee
05.01.2024 09:51+2Вроде бы автор делал игру, чтобы исполнить свою мечту..
fellow_pablo Автор
05.01.2024 09:51+2У нас всегда так: хотел исполнить мечту, а в итоге изучил новый ЯП...
Devastor87
05.01.2024 09:51+1Я так большую часть языков программирования изучил, которые знаю - метод хороший и интересный ????????
Dangetsu-PK
05.01.2024 09:51+1Согласен. Тоже порядком выгорел на вебе, уволился на пол года и начал игру пилить. Потом уже пришлось устраиваться обратно чтобы прокормить себя, но проект не забросил. Теперь работа для меня это просто средство для получения денег, а игра - цель. Хотя иногда мысли о бессмысленности все равно посещают, но 400 подписчиков на ютубе душу все равно согревают.
fellow_pablo Автор
05.01.2024 09:51Приятно видеть товарища на этом пути. Желаю удачи с проектом! Не исключаю, что и я вернусь ради денег, когда заканчиваться начнут, а пока все силы в свою разработку. Всё же для себя код пишется куда бодрее и приятнее)
Safort
05.01.2024 09:51Всегда интересно наблюдать за подобным прогрессом. Если можно, будущем, хотелось бы чуть больше технических подробностей связанных со стеком Rust/Bevy.
fellow_pablo Автор
05.01.2024 09:51+2Спасибо! Именно этой теме хочу след статью посвятить: покажу куски кода, поною о сложностях и тд.
gmg_gadmag
05.01.2024 09:51+1Автор гений! Создав интересную статью, он пропиарил своё творение. Вот он настоящий маркетинговый ход! Жду выхода этой игры!
s1lv3r-f0x
05.01.2024 09:51+2вот читаешь такие статьи и самому хочется пойти написать свою игру
Удачи авторуfellow_pablo Автор
05.01.2024 09:51Если заниматься этим, то нужно быть готовым потратить тысячи часов на код, арты и маркетинг. Иначе на что-то хорошее можно не рассчитывать.
Можно ещё попробовать команду поискать, но надёжных ребят "на энтузиазме" сложно найти, а кормить их - дело не дешевле. Да и гемора это добавляет...
Safort
05.01.2024 09:51+2Bevy интересный, но не слышали ли про https://fyrox.rs ? И если да, то почему выбор пал не на него?
fellow_pablo Автор
05.01.2024 09:51Как уже говорил, мне не нравится работать через GUI.
Реализация ECS в Bevy мне кажется более удобной и гибкой.
Больше звёзд на гитхабе.
У вас был опыт работы fyrox? Что интересного можете сказать?
UPD: @Safort(пардон, случайно не в ветку написал)
noldowalker
05.01.2024 09:51Занят примерно тем же, но все таки на юнити. В итоге пришел примерно к тому же, что описано в пункте про разработку. Успехов!
SuperKozel
Time remain, наверно потому что неисчислимое
fellow_pablo Автор
Довольно нелепая ошибка вышла. Спасибо! Сразу же исправил
IvanTes1
Всё правильно было написано, неисчислимые существительные используют грамматику единственного числа (т.е. окончание -s — "water flows", "time flies", "equipment breaks" и т.д.)