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

Заветная страница в Steam
Заветная страница в Steam

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

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

Прошлый опыт - работа над ошибками

Так Fusion Brain видит процесс подготовки
Так Fusion Brain видит процесс подготовки

Разумеется, в прошлом у меня не раз был «опыт» создания игр, хотя использовать именно такую формулировку язык не повернётся. Увы (или к счастью), скриншотов, а тем более каких‑либо файлов из тех проектов не сохранилось. Большинство из них в принципе не были доведены до конца. И это не удивительно! Работа велась максимально хаотично, многие очень важные сферы игнорировались (геймдизайн, маркетинг), а флагом об окончании проекта служило не достижение определённого уровня качества или функционала, а куда более сакральные причины вроде: «надоело» и «я придумал идею интереснее».

Сейчас же у меня есть немалый опыт работы, который научил меня, что это не самые лучшие маркеры того, что стоит завершать работу над проектом. Более того, годы размышлений и работы в айти сфере привели меня к очень важному инсайту: «хочу сделать крутую игру, где нужно бегать и сражаться со всеми» — не является геймдизайном, а «сначала найду картинки, потом напишу код и добавлю в игру музыку, а потом выложу игру и все будут в неё играть, потому что она крутая!» — не является планом действий. Соглашусь, что в этом есть какой‑то задор и боевой дух, но если проектом предстоит заниматься не 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 группы тасок:

  1. Багфикс

  2. Фичи

  3. То, что реализую, но когда-нибудь потом (когда в игру будет играть очень много людей и всё будет классно и чудесно).

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

Что дальше?

Так игра выглядит сейчас
Так игра выглядит сейчас

Впереди ещё очень много работы, даже чтобы покрыть первые две группы тасок.

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

  • Рассказать про особенности игры и её философию.

  • Описать дальнейшие планы по разработке.

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

  • Какие маркетинговые стратегии я использовал и использую?

  • Как я не сошёл с ума, работая один?

  • Как я создавал для себя продуктивную среду.

Комментарии (20)


  1. SuperKozel
    05.01.2024 09:51
    +2

    Time remain, наверно потому что неисчислимое


    1. fellow_pablo Автор
      05.01.2024 09:51

      Довольно нелепая ошибка вышла. Спасибо! Сразу же исправил


    1. IvanTes1
      05.01.2024 09:51

      Всё правильно было написано, неисчислимые существительные используют грамматику единственного числа (т.е. окончание -s — "water flows", "time flies", "equipment breaks" и т.д.)


  1. vassabi
    05.01.2024 09:51
    +10

    ну, делать игру, чтобы изучить новый язык программирования - это круто! :)


    1. fellow_pablo Автор
      05.01.2024 09:51
      +4

      Совмещать приятное с полезным) Куда интереснее, чем CRUDы клепать


      1. vassabi
        05.01.2024 09:51
        +5

        не, я слаб для фриланса - учил новые языки на проектах за зп %)


    1. feelamee
      05.01.2024 09:51
      +2

      Вроде бы автор делал игру, чтобы исполнить свою мечту..


      1. fellow_pablo Автор
        05.01.2024 09:51
        +2

        У нас всегда так: хотел исполнить мечту, а в итоге изучил новый ЯП...


    1. Devastor87
      05.01.2024 09:51
      +1

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


    1. Areso
      05.01.2024 09:51
      +1

      Всегда так делаю =)


  1. Dangetsu-PK
    05.01.2024 09:51
    +1

    Согласен. Тоже порядком выгорел на вебе, уволился на пол года и начал игру пилить. Потом уже пришлось устраиваться обратно чтобы прокормить себя, но проект не забросил. Теперь работа для меня это просто средство для получения денег, а игра - цель. Хотя иногда мысли о бессмысленности все равно посещают, но 400 подписчиков на ютубе душу все равно согревают.


    1. fellow_pablo Автор
      05.01.2024 09:51

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


  1. Safort
    05.01.2024 09:51

    Всегда интересно наблюдать за подобным прогрессом. Если можно, будущем, хотелось бы чуть больше технических подробностей связанных со стеком Rust/Bevy.


    1. fellow_pablo Автор
      05.01.2024 09:51
      +2

      Спасибо! Именно этой теме хочу след статью посвятить: покажу куски кода, поною о сложностях и тд.


  1. gmg_gadmag
    05.01.2024 09:51
    +1

    Автор гений! Создав интересную статью, он пропиарил своё творение. Вот он настоящий маркетинговый ход! Жду выхода этой игры!


  1. s1lv3r-f0x
    05.01.2024 09:51
    +2

    вот читаешь такие статьи и самому хочется пойти написать свою игру
    Удачи автору


    1. fellow_pablo Автор
      05.01.2024 09:51

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

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


  1. Safort
    05.01.2024 09:51
    +2

    Bevy интересный, но не слышали ли про https://fyrox.rs ? И если да, то почему выбор пал не на него?


  1. fellow_pablo Автор
    05.01.2024 09:51

    1. Как уже говорил, мне не нравится работать через GUI.

    2. Реализация ECS в Bevy мне кажется более удобной и гибкой.

    3. Больше звёзд на гитхабе.

    У вас был опыт работы fyrox? Что интересного можете сказать?
    UPD: @Safort(пардон, случайно не в ветку написал)


  1. noldowalker
    05.01.2024 09:51

    Занят примерно тем же, но все таки на юнити. В итоге пришел примерно к тому же, что описано в пункте про разработку. Успехов!