Разработка игры: 4 года и два новых человека
«Работа оплачивается опытом, а он налогами не облагается» Хэнк Хилл Здравствуй, Хабр! В данной статье мы хотели бы рассказать историю создания мобильной игры «Robot Alan», мотивированной простым желанием «Сделать игру!», которое вылилось в три с лишним года переделок, бросания и начинания заново. Мы постараемся показать весь наш путь и то как мы с моим товарищем развивались и менялись под влиянием этой небольшой игрушки. Осторожно! Много страшных картинок из прошлого, много трафика!
Вкратце о нас, меня зовут Александр, а моего товарища Ян. Я в то время (2011 год) в основном занимался автоматизацией некоторой бюрократии на Java и системным администрированием Solaris систем, и соответственно в будущей игре я отвечал за разработку. Ян более творческий человек с техническим образованием, рискнувший встать на путь художника (будем считать это собирательным понятием человека работающего с графикой во всех ее проявлениях), и в нашем мини-проекте он отвечал за все изображения, звуки, анимации и остальные красивости. Стоит отметить, что как у меня не было опыта в game dev-е, так и у Яна не было «профессионального» опыта в своем деле, ну или почти не было (в голодные студенческие времена мы немного промышляли созданием сайтов, ну, а кто не промышлял?!). Тем не менее игру хотелось сделать полностью самостоятельно, без привлечения посторонних людей.
В итоге так и получилось.
Желание создать игру пришло задолго до конкретной идеи игровой механики. Я перепробовал 3–4 идеи пока в голову не пришла та самая. Игра навеяна школьными временами 8–9 класс, где на уроках информатики мы работали в среде «Роботландия» (это такой набор ПО для обучения детей). В этой среде было представлено несколько исполнителей, одним из которых был несравненный «Кукарача». «Кукарача» — это таракан, находящийся на двумерном поле, умеющий выполнять простые команды «ВПЕРЕД, НАЗАД, ВЛЕВО, ВПРАВО, ПОВТОРИ, ЕСЛИ», с помощью которых он двигал буквы. Собственно, с помощью таких команд нужно было заставить таракана составлять определенные слова. Этакая вариация на тему машины Тьюринга.
Под влиянием ностальгии мне захотелось сделать нечто подобное в виде мобильной игрушки.
Находясь под эмоциональным впечатлением от идеи прототип игры был реализован за половину выходного дня. Писал я на Java с помощью фреймворка libGDX (аргументируя для себя выбор языка — мол, вон minecraft написали и ничего…
Выглядело оно как-то так
Суть игры простая. Игрок должен собрать звездочки в уровне. Уровень состоит из разноцветных блоков. Для того чтобы управлять персонажем нужно создавать команды вида:
ЕСЛИ <СВЕРХУ, СНИЗУ, СЛЕВА, СПРАВА> <КРАСНЫЙ, ЗЕЛЕНЫЙ> ТО ДВИГАЙСЯ <ВЛЕВО, ВПРАВО, ВНИЗ, ВВЕРХ>
После того как геймплей был опробован и очень нам понравился (ну еще бы он не понравился, в крови было столько эндорфинов, что я бы и на крестики с ноликами молился) нужно было придумать персонажа и его окружение. Curiosity тогда как раз собирался сесть на Марс и мы решили — ну вот и отличная тема: марсоход! И как раз выпустим игру к знаменательному событию! (это была первая ошибка в сроках — где-то на 3 года).
В рамках создания персонажа «луноход» был нарисован прототип, в последствии получивший название «пылесос»: мало того что он был похож на современный «умный» пылесос, но еще и в качестве демонстрации будущей анимации Ян подготовил ролик, где «пылесос» ехал против всех законов физики (обратите внимание на направление движения гусениц и поверхности). Для сравнения самая первая и финальная версии:
Конечно, сейчас это все выглядит очень смешно, но тогда казалось, что нужно убрать лишь немного шероховатостей.
Тем временем разработка игры продолжилась, а в качестве целевой платформы на тот момент были смартфоны на Android, обладателями которого мы, кстати, не являлись. Но возможность libGDX разрабатывать обычное desktop-приложение, а потом просто собрать его под Android очень воодушевляла, а устройство, думали, найдем, когда понадобиться. Наивность нашего восприятия бытия стала ясна лишь когда я попробовал собрать игрушку, чтобы показать другу на его смартфоне. Заместо 2.5к fps на desktop-е я увидел 17 fps на одном из последних смартфонов того времени. Связано это было, конечно, с отсутствием внятного опыта в game dev. В игре было очень много мест, которые можно было оптимизировать (хотя бы не отрисовывать всю игру, а только то, что попадает во viewport). Начались работы по оптимизации и мне удалось добиться 60 fps на том же смартфоне, но стало ясно что дальше разрабатывать игру без устройства очень глупо.
Как выяснилось, вселенную достаточно просто уведомить о своем желании. Под новый год со мной связались представители одной компании, для которой мы в тот год делали НИОКР, и сообщили, что в качестве дополнительной «благодарности» всем участникам они дарят сувениры. Я поехал в гостиницу к их представителю, который для этих целей прибыл в Санкт-Петербург и, к моему удивлению, сувениром оказался планшет Samsung GT-P1000. И теперь под новый год и январские праздники у меня оказалось новенькое устройство на Android.
Как только я поставил на него нашу игрушку я сразу понял, что с таким экраном (аж 7 дюймов =)) игрушка может выглядеть намного круче! Завладев моим разумом эта мысль привела к почти полной переделке игры (расширение игрового поля, дизайна и механики игры). Надо заметить, что постоянные мои предложения переписать игру Ян воспринимал с воодушевлением, то ли потому, что я ярко описывал насколько это будет круче, то ли он понимал, что то, что есть сейчас, во всех смыслах не то, что хочется показывать другим.
В итоге та переделка по непонятным причинам обросла различными доп. возможностями (вроде лазеров О_о) и выглядела примерно вот так:
С того времени игра уже порядком поднадоела и мотивации ею заниматься почти не было. Хорошо если удавалось хоть пару дней в месяц что-то в ней поковырять. Основным мотиватором тогда был обновляющийся арт от Яна.
Нужны были перемены, глоток свежего воздуха. Этой переменой стала покупка мною моего первого iPad (2-ка). Аппарат был сильно производительнее Samsung-а, и конечно же захотелось запустить нашу игру на нем. Создатели libGDX с самого начала обещали в будущем сделать возможность компиляции java игры на iOS (транзитом через Mono), но тогда этого еще не было (на сколько я знаю сейчас уже можно). Возможности нет, но очень хочется — я начал смотреть в сторону Objective-C. Посмотрел я на него дня три, с привязкой к cocos2d, сделал небольшой самый базовый прототип и понял, что это не принесло мне ни капли удовольствия. Язык мне не понравился и стремления его изучать не возникло. Отчасти потому, что я понимал, что кроме как для хобби, а точнее для конкретно этой игры, больше оно мне вряд ли понадобится.
Тогда я случайно наткнулся на CocoonJS. Это коммерческий продукт, который позволяет упаковать HTML/JS игру, разработанную на Canvas, в iOS приложение с производительностью «близкой» к нативной. Своего рода аналог PhoneGap, но для графики. Есть и open source версия подобного инструмента под названием «Ejecta», но я решил, что раз CocoonJS коммерческий продукт, то и качество вероятно будет лучше, тем более он был в чем-то вроде беты и был бесплатным (кстати все еще таким и остается, ребята тоже не торопятся).
С этого события начались времена переписывания игры на JavaScript. С JavaScript я был знаком, но не на «ты», скорее из серии «jQuery — это все что мне нужно». Почти полный аналог java версии я написал за 3 дня (как выяснилось, имея материалы, изображения и спрайты, зная что нужно реализовать — дело движется очень быстро). В процессе разработки меня все больше заинтересовывал язык JavaScript. После мира C и Java все эти его особенности вроде: особенное поведение this, прототипы, замыкания, (NaN!== NaN) == true — воспринимались, поначалу, как своего рода головоломки, что делало процесс его изучения очень интересным. В качестве фреймворка для игры я выбрал CAAT JS. Сейчас насколько я могу судить это далеко не самый известный и популярный фреймворк, но тогда его пиарили ребята из CocoonJS (как я понимаю они как-то связаны с его разработкой). Фреймворк очень простой и решал все необходимые нам проблемы (благо в нашей игре нет ничего сверхъестественного).
Переписав игру на JavaScript, спустя пару дней я наткнулся на один «transpiler» ES6 в ES5 (не помню на который, вроде бы на google traceur) и понял, что я очень хочу поработать с генераторами и переписать вместе с ними все асинхронные моменты в игре (а они там все такие). К счастью, в то время у меня было очень много работы, и свободного времени не хватало для очередных переделок и я как-то подостыл с этой идеей, успокаивая себя, что зато скоро таки выпустим игру.
Но судьба решила иначе. В этот раз удар пришел со стороны Яна. Пересматривая мультфильм «Валл И», Яну очень понравился контраст технологий и природы.
Обсудив, мы твердо решили, что нужно добавить этот контраст к нам в игру, что привело к появлению различных зеленых элементы меню:
Помимо добавлении зелени, Ян решил попробовать свои силы в 3D моделировании. Так получился прототип нашего персонажа, названный в последствии «стул»:
Основным моментом здесь стало то, что Ян начал заниматься 3D, которое его в последствии очень захватило и привело к ряду новых вариантов нашего персонажа:
Помимо изменения чисто графической составляющей игры это изменило и направление нашего мышления. Если раньше мы стремились максимально разнообразить игру, добавить новых сущностей (лазеры, порталы, и много, много всякой фигни), то теперь нами обуял полный минимализм. Мы вырезали почти все элементы, которые казались хотя бы слегка надуманными, что сделало игру менее разнообразной, но гораздо более «целостной». Апогеем минимализма стал отказ от текста в игре. Единственный текст, который можно встретить — это наши имена и олдскульная фраза «GAME OVER». Стоит отметить, что столь рьяный минимализм сделал игру заметно менее понятной для еще не знакомого с ней человека, но так мы чувствовали какое-то внутреннее удовлетворение…
Те друзья и знакомые, которым мы показывали игру, по-разному к ней относились. В целом всем нравилось, но для большинства, особенно не технических людей, она была крайне не понятна. Безусловно это приносило долю уныния, но те кому она все же нравилась — меняли ситуацию. В результате мы добавили несколько первых обучающих уровней. Финальная версия игры все еще не идеал, который есть где-то у нас в воображении, но это то, что не стыдно показать другим людям.
Конечная версия игры выглядит так:
Резюме
Что можно сказать в итоге. Игру мы переделывали очень часто под предлогом разных причин: новые технологии, новые цвета, новые идеи. Если бы не эти переделки игра была бы просто похоронена еще до рождения. Что касается нас, прогресс Яна, как мне кажется, особенно виден на контрасте первых его работ и итоговых. С тех пор Ян уже серьезно занимается 3D-анимацией и сейчас работает в одной из Питерских студий аниматором. Я же перекочевал с backend на frontend и работаю ведущим разработчиком, теперь программирую в основном на JavaScript.
Игра принесла нам не столько опыта сколько приятных воспоминаний и знания о новых направлениях для личностного развития.
Конечно, ничего шедеврального в игре нет, основная ее ценность, видимо, останется только между нами, но было здорово, и очень приятно если найдутся люди, которым она понравится и по прямому назначению.
Спасибо за внимание!