Разработка игры «Space Siege Warrior»

Предыстория

Всё началось 3 года назад, когда мой друг Хелот показал мне свою волосатую лопатку.

Urgantamah Ridge.Go Planet

Или не свою, или не лопатку…

Тогда мы сидели у меня дома, а он показывал этот занимательный фото ряд, на котором отдельные части тел людей напоминали пейзажи далёких планет. Хелот назвал свою выставку — «Неоткрытые планеты» (да, это серия фотографий была где-то на выставке в Минске). Но когда он впервые показывал эти снимки нам с женой, он едва ли мог вспомнить что именно он снимал и кто был на самих фото.

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

first steps

А так как я был совсем зелёным разработчиком, то поставленную задачу (движение персонажа по холмам) я выполнял медленно, это были одни из первых шагов в as3 и походило это скорее на тренировку, чем на настоящую разработку.

Я представлял задачу так: весь рельеф будет задан параболами, а каждый шаг персонажа (от точке A, к точке B) будет задан, как пересечение окружности и параболы:

first steps 2

Задача оказалась не такой простой. Я вывел достаточно сложное уравнение с четырьмя корнями. И попытки аккуратно перенести его в код растянулись на 2-3 дня. Просто дело требовало сосредоточенности, а меня в те моменты многое отвлекало и я допускал глупые ошибки. Для подтверждения своих расчётов, я активно пользовался сервисом wolframalpha (очень полезная штука).

Чтобы как-то проиллюстрировать пример сложности получившейся формулы, приведу кусок кода, который рассчитывает один из четырёх корней уравнения:

var result_1:Number = - .5 * Math.sqrt (Math.pow (b, 2) / (4 * Math.pow (a, 2)) + Math.pow ((Math.sqrt (Math.pow (( -72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d +
2 * Math.pow (c, 3)), 2) - 4 * Math.pow ((12 * a * e - 3 * b * d + Math.pow (c, 2)), 3)) - 72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d + 2 * Math.pow (c, 3)), (1 / 3)) / (3 * Math.pow (2, (1 / 3)) * a) + (Math.pow (2, (1 / 3)) * (12 * a * e - 3 * b * d + Math.pow (c, 2))) / (3 * a * Math.pow ((Math.sqrt (Math.pow (( -72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d + 2 * Math.pow (c, 3)), 2) - 4 * Math.pow ((12 * a * e - 3 * b * d + Math.pow (c, 2)), 3)) - 72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d + 2 * Math.pow (c, 3)), (1 / 3))) - (2 * c) / (3 * a)) - .5 * Math.sqrt (Math.pow (b, 2) / (2 * Math.pow (a, 2)) - ( -Math.pow (b, 3) / Math.pow (a, 3) + (4 * b * c) / Math.pow (a, 2) - (8 * d) / a) / (4 * Math.sqrt (Math.pow (b, 2) / (4 * Math.pow (a, 2)) + Math.pow ((Math.sqrt (Math.pow (( -72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d + 2 * Math.pow (c, 3)), 2) - 4 * Math.pow ((12 * a * e - 3 * b * d + Math.pow (c, 2)), 3)) - 72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d + 2 * Math.pow (c, 3)), (1 / 3)) / (3 * Math.pow (2, (1 / 3)) * a) + (Math.pow (2, (1 / 3)) * (12 * a * e - 3 * b * d + Math.pow (c, 2))) / (3 * a * Math.pow ((Math.sqrt (Math.pow (( -72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d + 2 * Math.pow (c, 3)), 2) - 4 * Math.pow ((12 * a * e - 3 * b * d + Math.pow (c, 2)), 3)) - 72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d + 2 * Math.pow (c, 3)), (1 / 3))) - (2 * c) / (3 * a))) - Math.pow ((Math.sqrt (Math.pow (( -72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d + 2 * Math.pow (c, 3)), 2) - 4 * Math.pow ((12 * a * e - 3 * b * d + Math.pow (c, 2)), 3)) - 72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d + 2 * Math.pow (c, 3)), (1 / 3)) / (3 * Math.pow (2, (1 / 3)) * a) - (Math.pow (2, (1 / 3)) * (12 * a * e - 3 * b * d + Math.pow (c, 2))) / (3 * a * Math.pow ((Math.sqrt (Math.pow (( -72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d + 2 * Math.pow (c, 3)), 2) - 4 * Math.pow ((12 * a * e - 3 * b * d + Math.pow (c, 2)), 3)) - 72 * a * c * e + 27 * a * Math.pow (d, 2) + 27 * Math.pow (b, 2) * e - 9 * b * c * d + 2 * Math.pow (c, 3)), (1 / 3))) - (4 * c) / (3 * a)) - b / (4 * a);

 

Нарисованный роботик стал бегать по экрану. Семья тем временем хотела что-то есть и приоритетнее было выполнять работу по flash’у  за деньги, поэтому я забросил игру более чем на два года…

2 года спустя

Периодически я возвращался к идее игры, делал некоторые наброски, записывал идеи. За это время я поднабрался опыта, сделав несколько игр под заказ или работая в конторе, и в феврале 2012 года твёрдо решил сделать свою первую игру. Но параллельно с основной работой. Выполнив рефакторинг старого кода и собрав рабочий прототип, я показал его коллеге по работе, хорошему художнику и аниматору Диме Пчелинцеву.

first prototype

Ему понравилась идея боя на холмистой местности. Снаряды летали по параболе, рельеф был неровный, это были интересные факторы, которые вносили в бой некоторую изюминку. Диме показалось, что игра в состоянии затянуть и у неё есть потенциал. И мы стали работать вдвоём.

Тогда была ещё неясна суть игры, т.е. что именно надо делать игроку. Т.к.  пространство было ограничено размером оригинальных фотографий, которые сложно было масштабировать, я решил поставить перед игроком долгоиграющую задачу в пределах этого ограниченного пространства. Мне пришла идея поместить в конце экрана вражескую базу, которую наш герой должен будет уничтожить, а враги будут отвлекать его от этой важной миссии.

add obstacles

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

Также я представлял, что на каждой планете должны быть странного вида существа — от аборигенов с топорами до многоруких слизней и интересных механизмов сложной конструкции. Но Дима видел у себя в воображении битву танков, он подошёл к делу практичнее и сказал мне, что многорукий слизень в реальном бою не выживет :) Так выглядели его первые наброски:

first units

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

Разработка шла дальше. В игровой логике были добавлены полезные вещи:

  • Появились промежуточные препятствия. Они позволяли более гибко настраивать сложность и продолжительность каждого уровня, регулировать сложность на отдельных участках пути (первое дополнительное препятствие появлялось в третьем уровне, а к одиннадцатому, предпоследнему, их было уже 4);
  • Препятствия стали генерировать врагов. Это добавляло мотивации разрушать их. Стреляя навесом можно было разрушать более значимые объекты первым делом;

Новые юниты меняют игру. Две революции.

Но настоящей революцией стало добавление летающих врагов.

flying enemies

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

Дима нарисовал прекрасных летающих юнитов. Особенно мне понравилось мнение ревьювера c fgl, уважаемого товарища General’а, по поводу первого летающего юнита — «ух, ты, гравицапа!». При создании летающих юнитов Дима тоже отказался от органики, все юниты в нашей игре были механическими.

flying enemies art

В дополнение к стреляющим врагам (4 танка + 3 летающих врага) были добавлены враги ближнего боя. Меченосец и пауки-скорпионы:

melee_enemies

Меченосец представлял серьёзную угрозу, а пауки брали количеством. Также им досталась роль слабеньких юнитов для разогрева в первых уровнях игры. И именно пауки совершили вторую революцию в игре. Дело в том, что в игре была проблема: генерация вражеских юнитов ближнего боя между стенами не давала противнику преимущества. Пока персонаж не уничтожал разделяющее себя и, например, меченосца препятствие, этот меченосец не мог нанести вреда. Но мы дали паукам возможность лазить по стенам!

spiders

Это позволило совершено по новому проектировать уровни и давать игроку ещё больше мотивации к скорейшему уничтожению препятствий, как генераторов новых врагов. А ещё это помогло сделать, на мой взгляд, самое фановое дополнение к игре — мы дали нашему персонажу возможность использовать паучьи лапы и самому лазить по стенам. Появилась новая тактика — оставив позади врагов, которые не могут преодолеть стены, быстро пробежать до главной базы и разрушить её. Это очень фаново!

spider legs

Дима усердно продолжал работу. Появилась заставка для основного экрана игры. Вот одна из её ранних версий:

first main screen

Главный герой

Игра потихоньку обрастала деталями и мы уже четко видели главного персонажа и его цели. Он робот-наёмник, который выполняет опасные задания по уничтожению вражеских баз и захвату ценных трофеев. В каждом уровне, при разрушении главной базы игрок видел какой-нибудь предмет. Целью главного героя было забрать этот предмет. Это и ознаменовывало успешное выполнение миссии. При этом количество оставшихся врагов не имело никакого значения.

prize

Т.к. наш робот в одиночку штурмовал огромные строения, я дал ему кличку «Звёздный таран» или «Осадный воин». Отсюда и появилось название игры — Space Siege Warrior. При успешном выполнении миссий наш наёмник получал деньги на которые мог покупать новые оружия и расширять свой арсенал. Но основные черты, которые проходили через всю игру (в начальной заставке, в туториале, в окне прохождения) были одинаковыми: пушка в правой руке и меч в левой.

star ram

Таким образом, игрок сразу видит, что существуют оружия ближнего и дальнего боя.

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

star ram config

Стремясь упростить управление, я реализовал автоматический удар оружием ближнего боя при приближении к врагам. Таким образом игрок непосредственно управляет только огнестрельным орудием. Получилось достаточно удобно, по крайней мере мы не услышали жалоб со стороны игроков.

Так же Осадный воин использует спецоружие. В процессе игры, он может на выбор воспользоваться одним из четырёх спецоружий:

  • Nitro — ускоряет робота, он двигается быстрее и эффективнее сражается в ближнем бою. Связка паучьих лап и Nitro является одной из самых эффективных в игре;
  • Shield — создаёт вокруг робота щит, который делает его неуязвимым. Щит замечательно сочетается с регенеративным доспехом «Онар»;
  • Rubon — наносит огромный урон по всем врагам вокруг;
  • Flash (секретное оружие) — парализует всех врагов на несколько секунд, они теряют ориентацию и не могут сражаться.

Отдельного внимания заслуживают добавление роботов поддержки, которые помогают Осадному воину. Это три специальных юнита, которые сражаются на стороне главного героя.

mate units

Эти юниты уникальны. Каждый используется для определённых целей и обладает особыми способностями: Тень невидима для врагов, но уязвима для случайных повреждений, Кречет запросто расправляется с воздушными угрозами, а Гамарус может сломать препятствие с двух ударов.

Вообще, для освещения мотивов главного героя неплохо было бы создать комикс — интро. Но на финальных стадиях разработки возникли некоторые сложности с артом и поэтому идею с комиксом решили отложить.

Анимация юнитов

Проектируя юнитов к игре мы с Димой сильно заморочились с их анимацией и внешним видом.

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

units animation

Во-вторых, у каждого юнита мы прорисовывали реалистичные развороты платформы:

units_animation_2

К тому же мы также анимировали развороты для оружия ближнего боя. Таким образом, получилось достаточно много анимаций, иногда выполненных в отдельных блоках (например у главного героя, т.к. его части тела меняются). Процесс создания арта получился очень трудоёмким.

Игровые фишки

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

tutorial

  • Двойная система повреждений. Юнитов (в том числе главного героя) можно уничтожить или лишив брони (здоровья), или максимально нагрев. Поэтому у юнитов присутствуют сразу 2 полоски их состояния (зелёная (броня) и красная (нагрев)). Зная о двойной системе повреждений, можно оптимально подбирать пару оружий ближнего и дальнего боя, чтобы обеспечить, например, максимальный тепловой урон;
  • Влияние температуры. На каждой планете своя температура (указана в окне выбора миссии), она влияет на нагрев и остывание всех юнитов. Т.о. на жарких планетах враги эффективнее убиваются тепловым оружием, а главному герою не помешает доспех с хорошим охлаждением;
  • Влияние гравитации. На каждой планете своя гравитация (указана в окне выбора миссии), она влияет на траекторию снарядов. При высоком уровне гравитации снаряды могут попросту не долетать до воздушных целей. Но в игре есть одно оружие, которое не подвержено действию гравитации — лазер. У него небольшая огневая мощь, но иногда лучше использовать именно его;
  • Влияние веса. При конфигурации робота в магазине каждая составная часть имеет свой вес, а каждая платформа (шасси робота) — свою грузоподъёмность. Чем больше нагружен робот, тем медленнее он передвигается. В отдельных случаях возможны ситуации, когда платформа не выдерживает веса, тогда приступить к выполнению задания невозможно.
  • Правильная конфигурация — залог успеха. Все улучшения в игре нелинейны, т.е. покупая более дорогую броню или оружие ты не всегда добиваешься лучших результатов. Важнее правильнее выбрать отдельные части робота для конкретной планеты, учитывая температуру и гравитацию. Или выработать свою тактику, сочетая различные элементы.

Редактор уровней

При разработке игры было создано 12 уровней. Именно столько удачных фотографий из серии «Неоткрытые планеты» удалось подобрать. В процессе работы был создан редактор рельефа:

relief editor

Все участки рельефа были заданы прямыми или параболами.

Пасхалки

Я не удержался и добавил в игру несколько пасхалок:

  • В игре есть секретное оружие, которое открывается при нажатии на 2 замаскированные кнопки в пользовательском интерфейсе.
  • Название одного из юнитов поддержки — это ник моего старого друга — Кречет;
  • Название спецоружия «Рубон» — это древнее название реки, которое течёт в моём родном городе, самом старом городе Беларуси.
  • Название спецоружия «Flash» — посвящение платформе, на которой была написана игра.

Звуки и музыка

При подборе музыки к игре, я для теста вставил туда одну мелодию, которую переодически слушал и впервые взял из журнала CHIP. Музыка принадлежала группе pianochocolate. Мелодия очень понравилась моей жене и она сказала, что музыка прекрасно подходит. Каково же было моё удивление, когда я узнал, что это российская группа. Когда я закончил основную работу над игрой, я связался с лидером группы Михаилом и мне удалось получить от него разрешение на использование их музыки в моей игре, за что им огромное спасибо!

Звуки я сначала пытался подобрать сам, а потом обратился за помощью к MrFuby — самому прославленному мастеру по звуку на flashgamedev.ru. Спасибо ему!

Один художник хорошо, а два — лучше

После четырёх месяцев совместной работы (не фул-тайм) моя часть работы ( программирование и геймдизайн) была сделана. Арт, который касается боевых действий, был готов на 80%, однако не было готово арта пользовательского интерфейса. Замечая, что энтузиазм Димы пропадает (видно, что он устал верить в мечту), мы решили расстаться и я решил найти кого-нибудь, чтобы за фиксированную сумму завершить работы по ui, или допилить всё самому. Но к тому времени я уже взялся за второй свой проект, где арт я рисовал сам, поэтому сильно не спешил. Спустя три месяца, после одной неудачной попытки договориться о дорисовке игры, мне вдруг крупно повезло: мне согласился помочь божественный художник Игорь Глущенко! Собственно говоря, он превратил игру в конфетку. Он переработал большинство визуальных элементов, добавил около 10-ка новых взрывов. Больше половины игроков отмечали, что взрывы просто великолепны.

explosion

Он создал визуальный редактор робота, существенно оживив игру.

visual unit editor

Перерисовал заставку основного экрана игры.

new main screen

Сделал замечатльное меню с выбором уровней:

levels screen

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

YouTube Трейлер

Итоги

В итоге игра была сделана за 8 месяцев (с февраля по октябрь), хотя активный период работы (по несколько, не менее 4-х, часов каждый день, вдвоём) длился около 4-х месяцев.

Я провел предварительное тестирование игры на форуме flashgamedev.ru, заказал на fgl пре-ревью, внёс ряд правок. После апрува игра получила следующие оценки на fgl:

Intuitiveness: 8 Great
Fun: 8 Great
Graphics: 7 Good
Sound: 7 Good
Quality: 8 Great
Overall: 7.5 Very Good

С такой оценкой игра пошла на аукцион.

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

Над игрой вели работу 2 художника и в конце разработки оба сказали, что фоны, которые использовались в изначальной идеи игры лучше было бы заменить, нарисовав их с нуля, более живые и красочные. Но т.к. сроки разработки существенно затянулись, то пока оставили то, что есть. Тем более, что мою душу согревала мысль о связи с первоначальной идеей. К тому же, в одиннадцатом уровне вам придётся сражаться с врагами на женской груди, и там большой накал страстей.

В игре остались нереализованными несколько хороших идей. Вот часть из них:

  • Скроллинг карты, т.е. возможность создавать длинные уровни, показывая только часть экрана и мини-карту внизу;
  • Комиксы для освещения сюжетной линии;
  • Захват баз пришельцами (реиграбельность уровней с изменением стиля игры, не захват, а оборона базы);
  • Ввести невидимых и подземных врагов и возможность переключатся в режим инфракрасного видения.

Они были отложены до лучших времён. Возможно, до создания второй части игры.

Поиграть в саму игру можно тут.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>