Делаем систему эффектов
Помимо боевой системы, в игре присутствуют системы сбора трав и крафта эликсиров. Один из них восстанавливает здоровье, другой – усиливает персонажа на некоторое время.
Если с работой первого вопросов не возникало, то со вторым были проблемы. Когда я давал поиграть в свою игру друзьям, они даже им не пользовались, а на вопрос почему – отвечали «непонятно, что оно дает».
В инвентаре, в рецепте каждого зелья, можно прочитать краткое описание эффекта, но их никто не читает. С зельем лечения это и не нужно. Все понятно – выпьешь и сразу полоска хитпоинтов поползет вправо. Если выпить зелье силы – с виду ничего не произойдет. Непонятно сработало оно или нет и сколько еще времени будет действовать. Не хватает какого-то фидбека.
Поэтому я добавил в игру возможность каждый эффект визуализировать.
Изначально систему, отвечающую за создание и применение эффектов, я взял из игры про петухов. Система слушает шину сообщений и при получении сигнала «создать такой-то эффект и применить к такой-то цели» берет из мапы зарегистрированных эффектов нужный и применяет к цели.
Эффект – это класс, который имеет доступ ко всем компонентам игрового объекта и потому может его как угодно менять: изменить количество очков здоровья, уменьшить скорость передвижения, увеличить наносимый урон и тд.
Эффекты могут быть разных типов: один может применяться сразу при создании, другой действует определенное время и по окончанию таймера производится отмена, третий имеет периодический характер и запускается с определенной частотой.
Класс эффекта оборачивается в класс, определяющий его тип, а система каждую итерацию игрового цикла обновляет их состояние и по необходимости удаляет отработавшие эффекты или создает новые.
Система и типы эффектов – вещи достаточно универсальные и могут быть переиспользованы в любой другой игре, а вот сами эффекты – это кусок конкретной игры, полагающийся на ее механики. Поэтому эффекты описываются отдельно за рамками системы и регистрируются перед запуском движка.
В игре с кибер петухами я собирался использовать этот инструмент для добавления разных видов оружия. На уровне могли появляться бонусы, меняющие тип атаки игрока: морозный лазер временно замедлял бы противника, огненный поджигал и наносил бы периодический урон от горения и тд. Всего этого не случилось, но эффекты обрели вторую жизнь в новой игре.
Не хватало только возможности отображать действие эффекта на экране. Что я и собирался добавить. При этом держа в голове, что система эффектов как и все остальные системы, ничего не должна знать про рендеринг и анимацию.
Поэтому было решено оформить каждый эффект как игровой объект, его детали вынести в отдельный компонент, а визуальную часть реализовать за счет уже имеющихся систем анимации и рендеринга, добавив соответствующие компоненты.
Если раньше по шине сообщений нужно было передать исчерпывающую информацию о создаваемом эффекте, то теперь достаточно указать его имя, а все остальное подтянется из создаваемого игрового объекта.
После всех подготовительных работ, объект эффекта добавляется к цели как дочерний и все остальные системы сразу же о нем узнают. За счет того, что координаты объектов вычисляются относительно координат родителя, спрайт эффекта отобразится там же где стоит цель. А стейт машина анимации будет переключать состояния, слушая сообщения, которые генерируют обертки вокруг эффектов, определяющие тип.
Так, после использования зелий, вокруг игрока вспыхивает цветная аура, а пока действует усиление, аура продолжает слегка мерцать. Чтобы знать точно когда сила зелья иссякнет, в игровом интерфейсе под полоской здоровья отображаются все активные эффекты с таймером и иконкой.
PS: Наконец-то запись моего доклада с HolyJS опубликовали на ютубе, поэтому если что, смотреть можно здесь.