Инди Андрей Кочнев
672

Plumber Jack: история одного платформера

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

В закладки
Аудио

Привет, DTF!

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

Немного предыстории

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

И уже где-то с марта затевали сделать что-то в этом жанре, даже участвовали в Ludum Dare со своего рода «пробой пера». Это был просто ужасный мини-платформер про скандинавскую лучницу, но зато мы пощупали core-механики и набили первых шишек. А художник к тому моменту уже отъехал на заработки в Китай, преподавать английский. В общем, никаких подвижек (даже идеи!) по проекту не следовало.

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

Кратко об идее

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

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

Сантехник. Чистильщик. Убийца. Когда где-то в городе происходит прорыв труб и на свободу вырывается очередная безумная помесь кракена с единорогом, первым звонят ему. И за этого славного малого нам и предстоит сыграть. Кстати, его зовут Джек. pLumber Jack

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

Процесс разработки

В качестве движка выбрали всем знакомый Unity. Чтобы упростить себе жизнь и не писать утомительные однотипные скрипты, не имеющие отношения к геймплею, купили ассеты Tile Tool 2D, Pro Camera 2D и Rewired Input Manager. Плюс использовали PixelArsenal для спецэффектов и заготовку для персонажа с хакатона.

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

Для начала решили вплотную заняться декомпозицией известных платформеров. Как выяснилось, прыжки в разных платформерах кардинально отличаются друг от друга: мы просмотрели около десятка популярных проектов и прыжки ощущаются по-разному буквально в каждом из них. Традиционно, высота прыжка зависит от продолжительности нажатия, но реализовано это может быть совершенно неожиданным способом. Например, в Hollow Knight персонаж поднимается вверх с равномерной (ну или почти равномерной) скоростью до того момента, пока не окажется в наивысшей точке прыжка. В Shovel Knight есть всего 3 градации прыжков: на 2, 3 или 4 ячейки в высоту. Разница между минимальным и максимальным прыжком в CupHead несущественна.

Прыжок в Hollow Knight - один из самых приятных в индустрии

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

Для тестирования прыжков использовали заготовку из серых блоков

Про дизайн главного героя

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

  • комбинезон, резиновые сапоги или костюм химзащиты (т.к. имеет дело с опасными отходами)
  • противогаз или дыхательная маска (т.к. в канализации полно паров)
  • связка ключей (для входа канализации, доступ есть только у него и нескольких других уполномоченных лиц)
  • рация (на случай ЧП) - Гаечные ключи, насос для выкачивания слизи (т.к. требуется для работы)
  • лучемёты и блоки питания "охотников за привидениями" (более оригинальный рабочий инструмент)
  • рога (т.к. красный цвет как бы отсылает к хэллбою, рога были бы кстати)
  • кожаная куртка (крутых парней часто изображают в кожанке!)
Процесс эволюции персонажа игрока

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

Нелегка жизнь видеоигрового персонажа!

Дальнейшая работа пошла куда быстрее: уже был проработан пайплайн создания персонажа, он и лёг в основу работы над противниками, которые добавлялись в игру по два в неделю - всё было предельно просто. Немного про их устройство: все противники по сути - рескин игрока, из которого удалены некоторые механики и заменен конфиг. Слишком просто? Да. Эффективно? Без сомнения! Так или иначе, именно эта особенность позволила нам создать 7 уникальных противников, потратив немногим больше времени, чем на главного героя. Ниже расскажем о парочке из них:

Шруман. Был создан самым первым. Умеет патрулировать и периодически выпускать шипы из своей головы. Осторожно: трипофобия!
Гриб-щитовик. Он должен был уметь защищаться от выстрелов игрока щитом, но что-то пошло не так

Следующий этап - полноценные уровни.

Шла середина июня, и уже стало ясно, что мы не сможем сделать уровень большим и монолитным (как, например, в Марио). Причина проста - слишком большое количество тайлов в памяти: во-первых, это очень долго прогружается, а во-вторых съедает много ресурсов ПК. Решение оказалось простым: разделить уровень на множество маленьких комнат. Никакой динамической подгрузки, никаких респаунов мобов. Просто включаем и выключаем объекты в Unity, телепортируя игрока к другому выходу. Дёшево и сердито. Впрочем, дальше всё равно пришлось расширить эту логику и забирать у игрока контроль в момент перехода: эту фишку мы подсмотрели в Hollow Knight.

Большой квадрат справа - это триггер перехода между уровнями. А стрелка помогает ИИ монстра понять, что здесь нужно развернуться. Скриншот из редактора Unity

Небольшой оффтоп: на этом этапе мы решили подать заявку на участие в инди-шоукейса на VK Fest. К счастью, игра была одобрена! Так что если есть желание познакомиться - приходите, нас можно будет найти в субботу в инди-шатре

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

О том, что мы не успели

Среди других вещей, которые сделать было нужно, но мы не успели:

  • Звуки, конечно же звуки. Их нет. Ну то есть совсем. Мы можете наслаждаться билдом под свой любимый трек.
  • Оптимизация. Это та часть работы, которой мы не занимались. Поэтому игра может оказаться очень требовательной к ресурсам. Просим прощения у игроков со слабыми ПК. Впрочем, стоит отметить: на ноуте 2009 года игра работает довольно гладко.
  • Не все механики органично вписаны в уровни. Это связано с тем, что они добавлялись в последние несколько дней, а наш левел дизайнер уже начал подготовку к вступительным в магистратуру. Удачи ему!

Ссылка на билд

Всем, кого заинтересовал проект, предлагаем скачать билд по ссылке ниже (для управления на клавиатуре используйте стрелочки, "Z и X". Но лично я рекомендую геймпад):

А также наш паблик в вк:

Спасибо за внимание и хороших вам игр!

#indiejam #индиджем #pixelart #gamedev #indie #PlumberJack #platformer

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Андрей Кочнев", "author_type": "self", "tags": ["platformer","plumberjack","indiejam","\u0438\u043d\u0434\u0438\u0434\u0436\u0435\u043c","pixelart","gamedev","indie"], "comments": 2, "likes": 15, "favorites": 12, "is_advertisement": false, "subsite_label": "indie", "id": 57794, "is_wide": false, "is_ugc": true, "date": "Sun, 07 Jul 2019 17:10:07 +0300" }
{ "id": 57794, "author_id": 72579, "diff_limit": 1000, "urls": {"diff":"\/comments\/57794\/get","add":"\/comments\/57794\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/57794"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64960, "last_count_and_date": null }
2 комментария

Популярные

По порядку

2

Выглядит как достойный 15 рублевый кандидат!

Ответить
2

Крюки напомнили Черного плаща) Там тоже за них цепляться нужно было.

Ответить
0

Прямой эфир

{ "remaining": "WzAsMSwyLDMsNCw1LDYsNyw4LDld" } [ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Игру с лучшим стелсом никто не заметил
Подписаться на push-уведомления