Два (четыре?) года разработки небольшой аркады

Два (четыре?) года разработки небольшой аркады

Игра, которую я делал больше двух лет, в итоге проходится за пару часов, работает только в новых браузерах, отрисовывает почти всю графику на CPU вместо GPU и, как только я обновляю билд на itch.io, каждый раз грузит заново все 40мб - короче, хорошо получилось.

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

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

Предыстория

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

Так вот, 4 года назад, почитав в интернете советов в стиле “scope small”, “для начала надо делать что-то обычное - Space Invaders, Змейку, Пакмана на худой конец”, “возьми игровой движок и не мучай мозг рутиной”, я решил сделать все наоборот.

Почему?

Не знаю.

Не помню.

В общем, я решил делать все с нуля. Включая непростую физику(!). В качестве инструмента для рендеринга я выбрал SVG (!!). И начал делать игру мечты - минималистичный экшн про череду boss-fight’ов с геометрическими фигурами, каждая из которых обладает уникальным хитровывернутым поведением и атаками, где игрок, в свою очередь, управляет ромбом, путешествующим по трехмерному кубу (!!!), на каждой плоскости которого находился очередной противник-босс.

В голове также был какой-то дикий сюжетный замысел про сознание человека, которое его ученый-коллега против его воли скопировал в цифровую форму, поместил в виртуальное пространство и начал проводить эксперименты. Было что-то про страдание, про персонификацию каждым из 9-ти боссов одного из библейских грехов (я не успел придумать откуда взять еще 2, помимо семи смертных), про катарсис и просветление ГГ в самом конце… Короче, в голове было очень много, гхм, разных идей.

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

Fun fact: на гейм-джеме Gaminator 16, на самом первом уровне нашей неуклюжей игрушки “Ретроспектива”, присутствовал противник - Треугольник, попортивший игрокам немало крови. Так вот он был сильно упрощенной версией того самого босса, которого я успел реализовать:

Начало основной разработки

Два года назад я решил начать все заново.

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

Несколько месяцев я потратил на прототипирование, пытаясь понять, что я вообще хочу от геймплея.

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

​Это выглядело невероятно убого, и игралось не многим лучше. Почему я вообще решил тогда продолжить?

Нижеописанные трюки выполнены (не)профессионалами, не пытайтесь повторить это дома

Как и в первой, неудавшейся игре, графика все также рисовалась программно, но теперь через canvas API.

Кстати, когда я говорю “программно”, я имею ввиду не рендеринг через изящные математические алгоритмы внутри какого-нибудь шейдера, а уродливую и императивную отрисовку в топорном стиле типа:

  1. примени дефолтный canvas-фильтр чтобы создать эффект свечения;
  2. нарисуй линии между такими-то координатами на виртуальном канвасе;
  3. запомни фигуру в памяти, копируй на канвас игры каждый раз, когда потребуется.

В какой-то момент я раздумывал над переносом рендеринга на какой-нибудь нормальный движок типа PIXI, но решил, что особого профита от него я не получу. Я же делаю игру с невероятно простой графикой, зачем мне целый движок? Что может пойти не так, ну?

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

Добавились какие-никакие анимации, свечения, вспышечки, частицы. Все на голом canvas API, даже без webgl (до сих пор через webgl отрисовывается только задний динамический фон и анимируется логотип в меню).

Процесс создания анимаций стал является той еще “инновацией”. Функция - фабрика анимаций - принимала на вход другую функцию-”рисовалку”, а также количество кадров. После чего для каждого кадра вызывала эту функцию-рисовалку, получая от нее сгенерированный кадр, и сохраняя его на виртуальный canvas. В итоге получался такой программно генерируемый spritesheet.

Fun fact: в процессе я узнал, что в Хроме нельзя создавать элемент canvas длиннее, чем ~20 000 пикселей. Будет забавно, если однажды в жизни мне пригодится этот факт.

В итоге, графика оказалась не самой сильной стороной игры. Она не поддерживает браузеры, кроме новых Chrome и Firefox, она нагружает процессор компа, при этом почти полностью игнорируя GPU, она невероятно неоптимизированна и переусложнена. При всей ее примитивности я иногда наблюдаю просадки ФПС на своем стареньком Mac Air.

я с содроганием вспоминаю, с какими мучениями я реализовывал анимацию появления/исчезания белых линий-"синапсов", уже будучи заложником своих неудачных решений

Сюжет и как я чуть не бросил разработку на середине пути

Чуть меньше года назад я задумался: зачем вообще нужен сюжет в аркаде?

По моим представлениям, среднестатистический игрок в такие игры больше угорает по спинно-мозговой активности и задорному геймплею, не выпускающему из “потока”. Такой вопрос я задал себе весьма своевременно - когда уже были написаны тексты для всей игры, и часть из них были на пробу озвучены голосом Chlora_Virgo.

И я решил - к черту сюжет и тексты. Только время сжирают. А еще я тогда был сильно запаренный и сказал всем вокруг - “все, заканчиваю разработку. Задолбало. Буду нормальную игру делать вместо этого говна. А это выкатываю на суд людской, как есть.”

Но окружающие меня люди (а также голос в моей голове) ответили мне:

“Ты что, дурак? Почти все сделано же уже. Доделай. А если боишься, что кого-то будет раздражать сюжет - добавь опцию отключения голоса нарратора и субтитров”.

Два (четыре?) года разработки небольшой аркады

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

Финал

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

Я посмотрел на нее взглядом, свежим после нескольких месяцев перерыва, и подумал:

Ох, а ведь круто же вышло! Надо сделать еще 20-40 уровней, добавить контента - врагов там, еще пару боссов, написать и наозвучить текстов... Можно будет даже за деньги продавать!

Геннадий, наивный молодой человек

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

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

​fun fact: рабочим названием игры было не “EGO Experiment”, а “Здравствуйте, Николай Петрович”. Кажется, в моей душе зеленый кристаллик-ГГ так и остался Николаем Петровичем.

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

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

И они такие клевые, что я чувствую себя довольно неловко - по качеству и объему этот OST получился на голову превосходящим саму игру.

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

финальный уровень, кривая сложности в котором так и не была мною нормально пофикшена. update - теперь все-таки пофикшена и босс более-менее проходим.

Я бы хотел сформулировать для себя какие-то уроки, умные мысли и вообще подвести итог - но ничего кроме "фффуууухх" в голову не приходит. И так все ясно. Надо нормально делать (а не как я) - тогда нормально будет.

4848
20 комментариев

Было что-то про страдание, про персонификацию каждым из 9-ти боссов одного из библейских грехов (я не успел придумать откуда взять еще 2, помимо семи смертных), про катарсис и просветление ГГ в самом конце…

Евангелион от мира браузерных аркад.

3
Ответить

Вообще годнота, особенно OST :)  Но я должен задать вопрос: тот факт, что загоняя стрелки в одну клетку их можно убить одним выстрелом - баг или фича? :)
UPD: Геннадий прав, на мобилках это бы взлетело по 50 центов, как времяубивалка, с возможностью выбора уровня :)

2
Ответить

Про баг или фича: на самом деле это - один из углов, срезанных мною в стремлении поскорей закончить. Конечно, круче было бы реализовывать для врагов какой-то pathfinding, чтобы "стрелки" не склеивались в одну - это бы выглядело интереснее. Но я посчитал, что это прокатит в качестве фичи.

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

1
Ответить

кстати, через itch.io в игру много играют?

2
Ответить

Ваще нормас.
Прятная озвучка, ненавязчивый юморок и простые понятные правила

1
Ответить

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

1
Ответить

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

Ответить