Популярное
Свежее
Моя лента
Сообщения
Рейтинг
Пополнить Steam
Низкая комиссия
Темы
Игры
Гайды
Офтоп
Ночной музпостинг
Вопросы
Творчество
Кино и сериалы
Музыка
Hollow Knight
Видео
Показать все
DTF
О проекте
Правила
Реклама
Приложения
Аккаунт удален
21.07.2020

Статья удалена

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

День 1

С утра я зашел на DTF, увидел тему, но ничего с ходу не придумал: были мысли сделать что-то про автоугон (отсылка к известному фильму) или что-то в духе Outer Wilds, но конкретный дизайн и геймплей придумать не получалось.

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

Орбитальное Сумо. Короче как Супер Смеш, только на орбите, сумоисты в скафандрах и через 60 сек все платформы взорвутся

Сразу же после этого я открыл Paint.Net и довольно быстро накидал вот такой концепт:

Первый концепт
Первый концепт

Ну что ж, цель стала понятна, а значит, можно начинать разработку.

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

В нём всё делается через код и можно ни на секунду не вылезать из IDE, для меня это гораздо проще и комфортнее, чем пользоваться разнообразными редакторами.

Вот так выглядит в нём код для создания подобной сцены:

AddEntity(new SpaceBackground()); AddEntity(new CollisionDetector()); var blocks = GenerateBlocks().ToList(); blocks.ForEach(x => AddEntity(x)); var sumoist1 = AddEntity(new Sumoist(new Vector2( blocks[1].Center.X, Screen.Height / 3), 0)); AddEntity(new SumoistController(sumoist1, new WasdControlSource())); var sumoist2 = AddEntity(new Sumoist(new Vector2( blocks[3].Center.X, Screen.Height / 3), 1) { Invert = true }); AddEntity(new SumoistController(sumoist2, Mode == GameMode.PvE ? new AiControlSource(this, sumoist2) : (IControlSource)new ArrowsControlSource()));

В разных играх я выбираю разные подходы и в данном случае пошел по ECS-like пути: классы Sumoist и Block по сути просто содержат данные, а вот CollisionDetector и SumoistController — физику и логику.

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

class Sumoist : BasicEntity, ICanBeEnabled { public static readonly Point Size = new Point(192); public Vector2 Vector { get; private set; } public Vector2 Center { get; set; } public Vector2 Radius { get; } = new Vector2(80); public Rectangle Border => new Rectangle(Position, Size); public float Speed { get; private set; } public bool IsEnabled { get; set; } = true; public bool Invert { get; set; } public bool Died { get; set; } public float Angle { get; set; } protected override SpriteDefinition SpriteDefinition => new SpriteDefinition { FileName = Resources.Sprites.Sumoist, Size = Size }; public Sumoist(Vector2 center, int frame) { Center = center; Frame = new Point(0, frame); Transformations.Add(FlipHorizontally); Transformations.Add(Recolor); Transformations.Add(Rotate); } private void FlipHorizontally(SpriteDrawEventArgs args) { if (Invert) args.SpriteEffects = SpriteEffects.FlipHorizontally; } private void Recolor(SpriteDrawEventArgs args) { if (Died) args.Color = Color.Red; } private void Rotate(SpriteDrawEventArgs args) { args.Rotate(Angle, new Vector2(0.5f)); } }

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

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

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

Взрываются астероиды по очереди в случайном порядке. Сначала сделал взрывы раз в 10 секунд, то есть последний взрывался на 60й секунде и таким образом через минуту на карте было просто не за что зацепиться — выжить в таких условиях игра точно не даст, а, значит, тема раскрыта — сессия точно не затянется дольше. Чуть позже я решил сократить задержку между взрывами до 5 секунд — в таком случае игрокам придется вести себя чуть агрессивнее, ведь долго на одном месте не постоишь.

Физика у взрывов довольно очевидная: находишься в поле действия взрыва - получаешь дополнительное ускорение по направлению от центра взрыва к краю.

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

Состояние на конец первого дня

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

День 2

Поскольку это уже последний день хакатона, надо определиться, что именно необходимо добавить в игру перед публикацией и вообще начать отслеживать конкретные задачи. Какой-то серьезный ALM тут конечно тоже не нужен — максимум Trello, а еще лучше Excel или OneNote — на последнем я и остановился, просто фичей с галочками мне хватит:

Список задач на второй день
Список задач на второй день

С меню всё в целом понятно, сделал его максимально просто — заранее всё отрисовал в Paint.Net, кинул отдельным слоем и готово. Довольно ленивый вариант, но зато занимает считанные минуты.

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

Мое рабочее место
Мое рабочее место

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

Музыку я нашел на популярном сайте FMA:

freemusicarchive.org
Free Music Archive

На нём стоит быть внимательнее, ведь лицензии там всё же разные и очевидно, чем более свободная лицензия у музыки — тем лучше для нас. Мне понравилась композиция Step to Space by Rolemusic и её можно даже в коммерческих проектах использовать — великолепно.

Для звуков есть похожий сайт — FreeSound:

freesound.org
Freesound - Freesound

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

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

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

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

Рисование с референса в Clip Studio Paint
Рисование с референса в Clip Studio Paint

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

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

www.nuget.org
Costura.Fody 4.1.0

Получили полностью portable исполняемый файл, который можно смело заливать на страницу хакатона.

Вот и всё, игра готова и загружена. Остается только ждать результата.

Финальная версия для хакатона

Выводы

  • Не обязательно начинать работу сразу как объявят тему. Потратив больше времени на поиск идеи, вы придете к дизайну, который реже будет меняться на протяжении разработки. У вас всего два дня, а значит, вы не можете поступать как Bungie: делать стратегию для Mac, а на середине передумать и сделать шутер для Xbox, это заставит вас выкинут немалую часть работы. Гораздо эффективнее выкинуть еще нереализованные идеи, чем ассеты или код. Конкретно в этой игре изменений по сравнению с концептом не так уж много и это очень хорошо для работы в сжатые сроки. У меня были игры, где дизайн многократно менялся и в итоге они получались более сырыми, ведь на то что пошло в финальную версию было потрачено меньше времени.
  • Свой движок это не так страшно, как многие думают. Да, если вы планируете работать в большой команде — просто берите Unity/Unreal или хотя бы Godot/Defold, ведь тогда вы сможете найти программистов у которых есть опыт работы с движком. Но если вы один — почему бы и нет? Основные преимущества для меня: всё в одной среде, простота отладки (можно добавить код движка в проект и при отладке заходить внутрь его методов), я полностью знаю как он устроен, изначальный дизайн ориентирован именно на быструю работу во время геймджемов, хакатонов и прочих конкурсов.
  • Процесс можно менять в зависимости от этапа разработки. Если на начальном этапе можно более свободно экспериментировать, пробовать разные идеи и итерационно улучшать геймплей, то на более поздних этапах не помешает чуть больше планирования, иначе вы рискуете не успеть реализовать всё что требуется, либо сдавать работу в бешенной спешке.

Что дальше

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

Пока что игру можно скачать на itch:

cherepets.itch.io
Orbital Sumo by cherepets

После этого вернусь к своему основному проекту (шутер от первого лица). Кстати, если у вас есть желание поработать над ним вместе - пишите.