22 июля 2020 22.07.20 6 9190

Успеть за 48 часов: как я участвовал в GMTK Game Jam 2020

+25

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

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

Game Jam (геймджем) — сбор разработчиков игр с целью разработки одной или нескольких игр за ограниченный промежуток времени (как правило, от 24 до 72 часов). Участниками геймджемов обычно являются программисты, геймдизайнеры, художники и другие специалисты, работающие в области разработки игр // Википедия

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

Недолго думая, для участия мною был выбран GMTK Game Jam 2020.

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

Выбор инструментов

Начало джема было запланировано на 11 июня, а потому у меня было чуть меньше полутора недель для подготовки, когда я принял решение подать заявку на участие. Прежде всего мне стало необходимо определиться с тем, какими средствами я буду пользоваться при создании игры. Ситуация осложнялась тем, что я не умею кодить, рисовать и писать музыку — т.е. не владею самыми базовыми навыками, которые необходимы любому инди-разработчику. И тем не менее игру мне сделать удалось, и одной из самых главных причин успеха стал правильный выбор инструментов.

Как не трудно догадаться, самым первым и самым главным стал выбор игрового движка.

В 2020-м выбор игровых движков велик, хоть и далеко не все из них просты в освоении

Среди всех доступных для использования движков подходящих для меня вариантов было два: Unity и GameMaker Studio 2.

Unity очень универсален и с этим движком я даже был немного знаком, но всё-таки освоить C# за несколько дней, пускай и на самом базовом уровне для меня оказалось проблематично, поэтому выбор пал на GameMaker Studio 2.

Почему именно GMS2? Ответ довольно прост: наличие системы Drag'n'Drop. Это дополнительный способ написания кода, который позволяет не писать код «руками», а использовать заготовленные таблички с действиями, которые затем можно выстраивать в алгоритмическую цепочку. И хотя собственный код в GMS2 тоже есть и он намного проще того же C#, использование данного метода позволило мне приступить к работе практически сразу же после установки.

Ближайший аналог Drag'n'Drop — Blueprints из Unreal Engine, однако последний движок я не рассматривал вовсе, так как Unreal в большей степени направлен на создание трёхмерной красивой графики, в то время как для себя я решил установить ограничение в 2D.

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

Далее нужно было определиться, где работать с графикой и аудио, и здесь всё оказалось куда проще. Ни рисовать, ни работать в фотошопе я не умею, потому решил использовать стиль пиксель-арта. Рисовать пиксели можно было и во встроенном редакторе GMS2, что я и делал время от времени, однако помимо этого мною был использован сайт pixilart — этакий упрощённый «фотошоп» для пиксель-арта.

pixilart.com

Для создания аудио были использованы сайты chiptone и beepbox.

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

sfbgames.com/chiptone

Также я решил использовать во время джема сайт-доску Trello для отслеживания прогресса при работе.

Отсчёт пошёл!

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

В общем, на данный момент работы принцип «чем проще — тем лучше» стал для меня основополагающим. Основные инструменты были под рукой, оставалось только дождаться оглашения темы...

Тема GMTK Game Jam 2020

К началу геймджема презентацию темы ожидало несколько тысяч человек, и вот, наконец, момент истины настал и на экране монитора появились заветные слова: «Out of Control».

Что же такого может быть «не под контролем»? Управление? Физика? Может быть, поведение врагов? Столько вариантов! Сразу же после оглашения темы я направился в… свою кровать. Так получилось, что начало джема вместе с презентацией темы проходило в 2 часа ночи по моему времени, поэтому я решил выспаться и уже с утра начать думать над дальнейшей тактикой, которой буду придерживаться оставшиеся двое суток.

На часах было около 9:00, когда я сел за компьютер, открыл блокнот и начал записывать идеи для игры. Спустя 15 минут список содержал в себе 8 позиций, среди которых:

  • платформер, в котором постоянно меняется гравитация
  • платформер, в котором у героя в любой момент может остановиться сердце
  • платформер, в котором постоянно меняются игровые уровни
  • платформер, в котором герой неконтролируемо прыгает
  • top-down-шутер, в котором оружие постоянно меняется

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

  • tower defence, в котором все башни имеют свой характер и настроение (могут перестать атаковать врагов / начать атаковать союзные башни)
  • платформер, в котором после смерти персонаж игрока каждый раз меняется, чтобы можно было пройти дальше (нужно искать способ «убиться»)
  • scroll-шутер, в котором нужно управлять не игроком, а врагами

Первый вариант показался мне очень интересным, но, как я уже указал выше, сделать tower defence сложнее и моих навыков в данный момент было недостаточно, поэтому эта идея была отмечена потенциально хорошей и оставлена дожидаться лучших времён.

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

Типичный scroll-шутер

Честно говоря, об этом варианте я ещё успел подумать перед сном, и к моменту, когда уже надо было окончательно выбрать над чем мне придётся работать последующие 40 часов, scroll-шутер смотрелся наиболее привлекательным. Во-первых, он близок по механике к top-down-шутеру (а если точнее, то он ещё проще), над которым я уже успел потренироваться, а во-вторых, идея того, что вместо управления героем нужно управлять его врагами, и при этом стараться сохранить игрока в живых, как минимум в теории казалась очень и очень интересной.

Спустя ещё несколько минут я окончательно сформировал концепт игры:

  • scroll-шутер, в котором игрок управляет не игроком, а его врагами (всеми сразу)
  • для победы необходимо набрать 1000 очков; очки начисляются каждый раз, когда «игрок» уничтожает вражеский корабль
  • вражеские корабли можно уничтожить не только подставив его под выстрелы «игрока», но и столкнув их друг с другом

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

К моменту, когда нужно было полноценно заняться созданием прототипа, на Trello были записаны основные задачи и сформирован примерный план на ближайшие пару суток

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

Конечный концепт был принят и одобрен, а потому я запустил GMS2 и стал собирать первый рабочий прототип.

Слово «рабочий» здесь не случайно, так как сразу написать скрипт, по которому корабль игрока мог бы самостоятельно периодически выполнять два действия — двигаться влево или вправо и стрелять — у меня не получалось. Если сказать точно, то у меня ушло на это около четырёх часов, потому что звездолёт то застревал в границах экрана и после этого отказывался перемещаться, то вовсе оказывался вне поля зрения и возвращаться обратно не собирался. Разобраться с этой проблемой мне помогло два простых решения. Чтобы границы экрана не мешали кораблю передвигаться я просто убрал их — в GMS2 есть опция, позволяющая «замкнуть» игровую комнату, чтобы при выходе за границы объекты могли переходить с одной стороны экрана на другую, как это было, например, в Doodle Jump (если вы ещё помните такую игру). Также, чтобы корабль научился останавливался после перемещения, я добавил ему параметр трения.

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

Всё так

В общем, с поведением корабля игрока (которым игрок не управляет — такой вот парадокс) было покончено и настало время разобраться с управлением вражеской армией, ведь как вы помните, нужно было сделать так, чтобы можно было управлять всей армией сразу. Почему? Ну, если бы пришлось давать управление над каждым отдельным врагом по очереди, то тогда бы могла снизиться динамика игры, а идея управлять целым космическим флотом позволила значительно упростить работу. Также это решение было продиктовано сюжетом игры, о котором будет позже. 

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

Помимо этого нужно было сделать несколько типов врагов, а также сделать так, чтобы они уничтожались при попадании выстрела и при столкновении друг с другом. Что же, за дело!

К 18:00 прототип выглядел примерно так:

Вместо кораблей — треугольники и квадраты, но это только на первое время

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

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

48 часов — это не так уж и много, однако сон и периодический отдых никто не отменял

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

День второй, в котором автор встречается с некоторыми трудностями и познаёт суть дедлайнов

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

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

Так как геометрические фигуры должны были уйти в прошлое, я придумал для кораблей новые названия. Так ромбик, звёздочка и полукружнополуквадрат (да, я продолжу так называть эту фигуру) стали Бойцом (Fighter), Перехватчиком (Interceptor) и Тараном (Ram) соответственно. Нужно было сделать их как можно более различными, ведь игроку нужно сразу понять, какой враг перед ним и принять решение, как действовать дальше, именно поэтому я сделал вражеские корабли трёх разных цветов.

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

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

Боец, как самая распространённая боевая единица стал самым маленьким; Перехватчик в виду своей маневренности представляет собой сплошное V-образное крыло; Таран — с широким «лбом». Ну и конечно же «вилкообразный» корабль игрока — просто чтобы выделялся среди остальных!

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

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

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

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

Итого, после нескольких часов сражения с пикселями игра стала выглядеть вот так:

Выглядит неплохо!

На часах было уже около 18:00, когда я закончил работу над спрайтами для выстрелов и поправил анимации таким образом, чтобы при движении влево и вправо корабли соответственно наклонялись в одну сторону. Для этого пришлось несколько изменить управление, и теперь при нажатии весь флот продолжит двигаться в одну сторону, пока не сменит направление или не нажать стрелку «вверх». 

Крайний срок для загрузки игры заканчивался 13 июля в 2:00, т.е. ровно через 48 часов после начала джема. Изначально я планировал успеть сделать всё до полуночи, так как нужно было ещё оформить страницу с игрой, добавить описание, да и в последний момент наверняка начнут загружать свои прототипы большая часть претендентов, а потому itch.io мог запросто «упасть». За оставшиеся 6 часов нужно было сделать ещё многое: сделать главное меню и меню паузы и переходы между ними, добавить звуковые эффекты и босса.

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

Всё так [2]

С экранами победы и поражения всё получилось сделать быстро: вывести надпись «YOU WON!» или «GAME OVER!» не так уж и сложно. Затем было сделано два экрана с обучением, где описывались вражеские корабли и их особенности, а также схема управления. На стартовом экране же я решил поместить корабль «игрока» и выноску с названием игры — к стати о названии...

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

Мне захотелось как-нибудь обыграть название темы «Out of Control». Если не стараться уничтожать корабли пришельцев, то вскоре они начнут заполнять собой весь игровой экран и будет крайне трудно в таких условиях сохранить игрока в живых, а потому название «Out of Space» обозначало бы одновременно и то, что действие происходит в космосе, и то, что места для манёвра постоянно становится всё меньше и меньше.

Потратив несколько минут на оформление, стартовый экран стал выглядеть очень даже привлекательно:

Стильно!

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

Когда я посмотрел на время и увидел 23:30, то понял, что до полуночи игру я точно не загружу, а значит придётся использовать дополнительные два часа. Хоть мне и хотелось оставить это время про запас, деваться было некуда.

С помощью chiptone я быстро наклепал звуки выстрелов, взрывов и т.д., а в beepbox'е накидал простенькую мелодию.

На часах 0:30, и я решаю начать работу над боссом для игры. Идея эта, мягко говоря, сомнительная, ведь босса нужно нарисовать и анимировать, а по размерам он должен быть больше Тарана примерно в два раза. Однако же мне показалось, что в игре маловато контента и босс обязательно должен быть, поэтому я приступил к работе над ним.

Примерно так я ощущал себя в последние пару часов до закрытия подачи заявок

Что ни говори, а своей скоростью рисования в тот момент я бы был удивлён, если бы у меня на это было время. Единственной проблемой стало то, что органично добавить его в игру никак не получалось, поэтому я сделал для босса целый отдельный уровень (но вам я его не покажу).

В 1:30 я запустил финальный билд игры и проверил, что босс действительно появляется после набора игроком 1000 очков, после чего выдохнул и открыл страницу джема на itch.io.

Я начал оформлять страницу со своей игрой, как понял, что ещё не подготовил дистрибутив. Повезло, что в GMS2 сделать дистрибутив можно нажатием одной кнопки, что я и сделал. Спустя пару секунд .zip-файл со всем содержимым был готов и я загрузил его на страницу с моей игрой.

Оставшиеся 20 минут я занимался оформлением страницы, добавил описание игры и пару скриншотов. В 2:03 доступ к загрузке файлов был закрыт.

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

Подведение итогов

Утром я ещё немного поработал над оформлением страницы. Для оценки проектов участникам джема была отведена неделя. Прежде чем перейти к этой части моего участия в GMTK Game Jam 2020, я выделил несколько недочётов в планировании своей работы, из-за которых не все задачи были выполнены:

  • неправильное раставление приоритетов: работу над переходами между экранами нужно было провести до того, как начать рисовать спрайты
  • на само рисование ушло много времени, из-за чего сразу несколько механик (выпадающие из врагов улучшения, новые типы врагов) не были сделаны
  • незнание некоторых базовых функций GMS2, с которыми пришлось ознакомиться по ходу разработки
  • некоторые баги, которые можно было исправить при тщательном тесте игры, не были исправлены
  • в последний момент изменённый баланс получения очков за разрушение кораблей сделал задачу набора 1000 очков достаточно трудной

Не всё из списка удалось реализовать, но определённый успех достигнут!

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

***

Всего на GMTK Game Jam 2020 было сделано почти 5,5 тысяч игр, с которыми можно ознакомиться здесь. Если же вы хотите можете попробовать набрать 1000 очков и увидеть того-самого босса, то можете перейти по ссылке. Только учтите, что это версия с багами, и при битве с боссом музыка почему-то начинает двоиться. В скором времени я планирую их исправить и доделать оставшиеся штуки вроде улучшений, так что stay tuned!

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

До новых встреч!

( ͡° ͜ʖ ͡°)

Просто одна из игр, сделанных для джема. Ссылка для ваших друзей, если вдруг заинтересуются
( ͡~ ͜ʖ ͡°)


Лучшие комментарии

И полгода не Прошло, а всё-таки смог вспомнить пароль от аКкаунта ( ͡° ͜ʖ ͡°)

P.S.: как оказалось, то что у меня был заложен нос и болела голова это было не от усталости, а подтверждённый COVID-19 (уже здоровый, так что вроде обошлось).

в этой игре надо стрелять не по ребенку, а в окружающие его предметы(сам играл, не надо смотреть на 2006 в нике)

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

А что? Звучит хайпово неплохо! Можно сделать неплохую пародийную игрушку. Например, ГГ слишком чувствителен ко всему на свете, поэтому, в некоторых обстоятельствах, сам факт прыжка вызывает смерть. Эх, какие бы истории были.
Я шёл по деревне, всё было хорошо, никого не трогаю и меня никто не задевает. Жить можно.
Но потом ГГ увидел розовую постель, напоминавшую ему о давно погибшей матери. Смерть пробежалась пред глазами, от чего тот же герой подпрыгнул и умер, не почувствовав землю под ногами.

Да и сама концепция того, что нужно изучить персонажа, а потом уже играть за него — достаточно интересна.
P.s. Под тему ещё подходит игра Baby Boomer, где нужно было стрелять по ребёнку из светового пистолета. Её ещё помнит кто-нибудь?
Точно не знаю, но высока вероятность, что в медицинском учреждении, в котором проходил практику (и которое закрыли на карантин спустя пару дней, когда у меня появились первые симптомы). Сейчас уже осталось дождаться повторного отрицательного теста, а то пока что не выпускают из дома :/
Может это не то. Ведь из-за упадка медицины в странах СНГ любую болезнь теперь в это записывают.
А хоть проблемов нет?
Читай также