Статья удалена
Хочу рассказать вам о процессе создания своей игры для хакатона.
День 1
С утра я зашел на DTF, увидел тему, но ничего с ходу не придумал: были мысли сделать что-то про автоугон (отсылка к известному фильму) или что-то в духе Outer Wilds, но конкретный дизайн и геймплей придумать не получалось.
Только ближе к вечеру мне пришла в голова идея про орбитальное сумо и пришла она практически сразу законченной. Вот первое описание, которое я сразу же скинул другу в телеге:
Орбитальное Сумо. Короче как Супер Смеш, только на орбите, сумоисты в скафандрах и через 60 сек все платформы взорвутся
Сразу же после этого я открыл Paint.Net и довольно быстро накидал вот такой концепт:
Ну что ж, цель стала понятна, а значит, можно начинать разработку.
Игру я решил делать на своем движке, которым занимаюсь уже около трёх лет и неоднократно использовал его в различных конкурсах и джемах. Он не сильно продвинутый, но отлично подходит чтобы быстро накидать прототип.
В нём всё делается через код и можно ни на секунду не вылезать из IDE, для меня это гораздо проще и комфортнее, чем пользоваться разнообразными редакторами.
Вот так выглядит в нём код для создания подобной сцены:
В разных играх я выбираю разные подходы и в данном случае пошел по ECS-like пути: классы Sumoist и Block по сути просто содержат данные, а вот CollisionDetector и SumoistController — физику и логику.
Вот весь код сумоиста: ничего сложного — чуть-чуть данных, описание спрайта и пара трансформаций при отрисовке:
С физикой чуть-чуть посложнее: найти пересечение прямоугольника и окружности (а сумоисты у меня считаются просто окружностями) оказалось не слишком сложно, но что дальше? Попробовал сделать примерно как в оптике, где угол падения равен углу отражения, но это выглядело слишком предсказуемо и просто. Попробовал добавить имитации различных сил, но всё равно выглядело скучновато.
Тогда я решил переделать блоки в окружности и так они стали уже астероидами. При столкновении с астероидом вектор сумоиста заменяется вектором идущим от центра астероида к точке столкновения. Ну и конечно умножаем это всё на нашу уже накопленную скорость. Это не сильно реалистичное поведение, но зато игроку его довольно просто понять (ударился об правую сторону астероида — полетел вправо, ударился об верхнюю — вверх) и временами это приводило к тому что игра начинала выглядеть как пинбол, а это забавно.
Астероиды сделал взрывающимися, как изначально и хотел, но вместо таймера как на концпете, сделал так чтобы они мигали красным когда хотят взорваться и частота мигания увеличивалась ближе ко взрыву. Вроде выглядит неплохо и довольно очевидно для игрока.
Взрываются астероиды по очереди в случайном порядке. Сначала сделал взрывы раз в 10 секунд, то есть последний взрывался на 60й секунде и таким образом через минуту на карте было просто не за что зацепиться — выжить в таких условиях игра точно не даст, а, значит, тема раскрыта — сессия точно не затянется дольше. Чуть позже я решил сократить задержку между взрывами до 5 секунд — в таком случае игрокам придется вести себя чуть агрессивнее, ведь долго на одном месте не постоишь.
Физика у взрывов довольно очевидная: находишься в поле действия взрыва - получаешь дополнительное ускорение по направлению от центра взрыва к краю.
В принципе кор-механика готова, играть довольно весело, особенно если соперник уже тоже разобрался с управлением. Выглядит очень близко к концепту:
Времени было уже за полночь и неплохо было бы поспать, но вместо этого я сел играть и выключил Xbox только когда на улице начало светлеть.
День 2
Поскольку это уже последний день хакатона, надо определиться, что именно необходимо добавить в игру перед публикацией и вообще начать отслеживать конкретные задачи. Какой-то серьезный ALM тут конечно тоже не нужен — максимум Trello, а еще лучше Excel или OneNote — на последнем я и остановился, просто фичей с галочками мне хватит:
С меню всё в целом понятно, сделал его максимально просто — заранее всё отрисовал в Paint.Net, кинул отдельным слоем и готово. Довольно ленивый вариант, но зато занимает считанные минуты.
Логотип сделал тоже максимально быстро: взял перо (мой основной компьютер — это планшет на Windows и у него довольно приличный диджитейзер, для моих невысоких навыков рисования его более чем хватает) и разными кистями от руки написал заголовок. Вот и всё лого. Добавить бы ещё какую-то деталь, символизирующую движение по орбите, но времени нет и вообще это не в приоритете.
Подсчет очков тоже максимально очевидный. Векторные шрифты движок не поддерживает, поэтому цифры — просто спрайты. Когда сумоист пролетает под счетом, я делаю счет полупрозрачным, чтобы он не мешался.
Музыку я нашел на популярном сайте FMA:
На нём стоит быть внимательнее, ведь лицензии там всё же разные и очевидно, чем более свободная лицензия у музыки — тем лучше для нас. Мне понравилась композиция Step to Space by Rolemusic и её можно даже в коммерческих проектах использовать — великолепно.
Для звуков есть похожий сайт — FreeSound:
Звук выбрать оказалось несложно — дизайн персонажей у меня довольно странный, баллоны и трубка у них более свойственны аквалангистам, чем космонавтам, поэтому я посчитал забавным, если скафандр будет металлическим — примерно как у папочек в BioShock. Поэтому и звуки я выбрал соответственные. При выборе звуков так же важно смотреть на конкретную лицензию.
Теперь настало время взяться за искусственный интеллект противника — играть вместе весело, но всё же не у всех может оказаться рядом друг, готовый поиграть в такое. Конечно было бы круто сделать осмысленный AI, предугадывающий все траектории и действующий эффективно, но во-первых, это затратно по времени, а во-вторых, не соответствует нашей цели — нам нужен противник с которым будет весело, а не противник, который победит.
Добиться этого довольно легко, решение было еще в классических частях HoMM: есть несколько несложных стратегий поведения и в начале раунда бот берет одну из них. В моем случае я выделил всего 2 совсем простых для реализации стратегии: атаковать и держаться центра + дополнил их опциональным отступлением в начале. В итоге мы имеем несколько неэффективных ботов, каждого из которых легко победить, но игрок не знает с каким именно из ботов ему предстоит сразиться и из-за этого может тоже выбрать неэффективную стратегию противодействия ему.
Последнее, что осталось — это как-то более красиво обставить победу. Я решил, что в игре нехватает каких-то референсов к непосредственно самому спорту Сумо (разве что волосы наших космонавтов собраны в пучок за головой как у многих сумоистов), так что я глянул пару соревнований и принял решение изобразить традиционного японского рефери Сумо — Гёджи. Нарисовал опять же от руки на планшете в Clip Studio Paint — отличная рисовалка, всем рекомендую. Немного дороговата, но и удобство выше, чем у всего что я пробовал раньше.
Стиль рисовки выбрал самый простой, никаких лишних деталей, но достаточно информации для понимания персонажа. В случае победы он просто машет в сторону победителя. Фича совершенно необязательная, но всё же она увеличивает награду за победу, а это может быть важным для многих игроков. Так же становится проще понять кто победил в случае если оба персонажа слишком близко к краю экрана.
Отлично, игра готова, можно запаковывать и публиковать. Я не сильно люблю когда подобные конкурсные игры имеют какие-либо установщики или вообще что-то пишут в систему. Никто не хочет чистить компьютер после тестирования пару мелких игр. Поэтому я просто запаковываю всё в один исполняемый файл при помощи данного пакета:
Получили полностью portable исполняемый файл, который можно смело заливать на страницу хакатона.
Вот и всё, игра готова и загружена. Остается только ждать результата.
Выводы
- Не обязательно начинать работу сразу как объявят тему. Потратив больше времени на поиск идеи, вы придете к дизайну, который реже будет меняться на протяжении разработки. У вас всего два дня, а значит, вы не можете поступать как Bungie: делать стратегию для Mac, а на середине передумать и сделать шутер для Xbox, это заставит вас выкинут немалую часть работы. Гораздо эффективнее выкинуть еще нереализованные идеи, чем ассеты или код. Конкретно в этой игре изменений по сравнению с концептом не так уж много и это очень хорошо для работы в сжатые сроки. У меня были игры, где дизайн многократно менялся и в итоге они получались более сырыми, ведь на то что пошло в финальную версию было потрачено меньше времени.
- Свой движок это не так страшно, как многие думают. Да, если вы планируете работать в большой команде — просто берите Unity/Unreal или хотя бы Godot/Defold, ведь тогда вы сможете найти программистов у которых есть опыт работы с движком. Но если вы один — почему бы и нет? Основные преимущества для меня: всё в одной среде, простота отладки (можно добавить код движка в проект и при отладке заходить внутрь его методов), я полностью знаю как он устроен, изначальный дизайн ориентирован именно на быструю работу во время геймджемов, хакатонов и прочих конкурсов.
- Процесс можно менять в зависимости от этапа разработки. Если на начальном этапе можно более свободно экспериментировать, пробовать разные идеи и итерационно улучшать геймплей, то на более поздних этапах не помешает чуть больше планирования, иначе вы рискуете не успеть реализовать всё что требуется, либо сдавать работу в бешенной спешке.
Что дальше
Дальше я планирую немного доработать игру: поправить баги, добавить анимации, плавные переходы и т.п., управление с других средств ввода (геймпада, сенсорного экрана, акселерометра) и залью еще на пару площадок. Она останется полностью бесплатной, возможно будет возможность скинуть мне бакс (если не лень будет её вводить).
Пока что игру можно скачать на itch:
После этого вернусь к своему основному проекту (шутер от первого лица). Кстати, если у вас есть желание поработать над ним вместе - пишите.