wand-magic-sparklesЭффекты

Эффекты временно берут под контроль сущность для сложных действий, таких как рывки, атаки, анимации поедания, катсцены или последовательности смерти/возрождения.

Эффекты можно использовать на игроках, NPC или любой сущности. Они особенно полезны, когда вам нужно:

  • Движение, которым вы управляете в коде (рывок/отбрасывание/крутка)

  • «Блокировать» ввод игрока на короткую последовательность (поедание, оживление, катсцена)

  • Временное состояние (неуязвимость, замедление, оглушение)

  • Интерфейс, связанный с временным состоянием (обратный отсчёт до возрождения)

Активные и пассивные

All Out поддерживает два типа эффектов:

  • Активные эффекты: по одному за раз для каждой сущности. Установка нового активного эффекта прерывает текущий активный эффект.

  • Пассивные эффекты: несколько могут быть прикреплены одновременно (накопимые баффы/дебаффы/статусы).

circle-info

Активный эффект также вставляется в список эффектов сущности, поэтому он отображается в effect_iterator так же, как и пассивные эффекты.

Быстрый старт (простой временной эффект)

Создайте класс, который наследует от Effect_Base, затем прикрепите его к сущности.

Apple_Pop_Effect :: class : Effect_Base {
    sprite: Sprite_Renderer;
    start_scale: v2;
    start_pos: v2;

    effect_start :: method() {
        sprite = entity->get_component(Sprite_Renderer);
        start_scale = entity.local_scale;
        start_pos = entity.local_position;
        set_duration(0.4); // автоматически удаляется через 0.4 с
    }

    effect_update :: method(dt: float) {
        t := get_elapsed_time() / 0.4;

        // Увеличивается в масштабе, затем сжимается до ничего
        scale_curve: float;
        if t < 0.3 {
            scale_curve = lerp(1.0, 1.3, Ease.out_back(t / 0.3));
        } else {
            scale_curve = lerp(1.3, 0.0, Ease.in_back((t - 0.3) / 0.7));
        }

        entity->set_local_scale(start_scale * scale_curve);

        // Немного всплывает вверх
        rise := Ease.out_quad(t) * 0.5;
        entity->set_local_position({start_pos.x, start_pos.y + rise});

        // Исчезает ближе к концу
        if sprite != null {
            alpha := 1.0 - Ease.in_quad(max(0.0, (t - 0.5) / 0.5));
            sprite.color.w = alpha;
        }
    }

    effect_end :: method(interrupt: bool) {
        // Очистка при завершении (или прерывании)
        entity->destroy();
    }
}

Прикрепите его как активный эффект:

Жизненный цикл эффекта

Эффекты основаны на обратных вызовах. Реализуйте только то, что вам нужно:

  • effect_start(): вызывается один раз при прикреплении эффекта

  • effect_update(dt): вызывается каждый кадр

  • effect_late_update(dt): вызывается каждый кадр после effect_update

  • effect_end(interrupt): вызывается при удалении эффекта

Активные эффекты (исключительный контроль)

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

Если у сущности уже есть активный эффект, он завершается с interrupt = true.

Пассивные эффекты (накопимые баффы / статус)

Используйте add_passive_effect для эффектов, которые могут стекаться (замедление, яд, щит, окно неуязвимости).

Справочник API

Effect_Base

Применение / удаление эффектов

Проверка / итерация эффектов

circle-exclamation

freeze_player против disable_movement_inputs

  • player_specific.freeze_player = true: полностью фиксирует позицию игрока.

  • player_specific.disable_movement_inputs = true: игнорирует ввод, но ваш эффект всё ещё может перемещать игрока (рывок/крутка).

Оба применяются только когда player != null (т.е. эффект находится на сущности, которая имеет Player компонент).

Примеры эффектов

Рывок / кручение (активный эффект)

Окно неуязвимости (пассивный эффект)

Используйте пассивный эффект для представления состояния неуязвимости и проверяйте его везде, где наносится урон.

Увеличение в 2 раза на несколько секунд (пассивный эффект)

Последовательность смерти / возрождения (активный эффект с локальным UI)

Блокировка катсцены (активный эффект)

Лучшие практики

  • Используйте set_active_effect когда эффект «владеет» сущностью на короткую последовательность (рывок/атака/смерть/катсцена).

  • Используйте add_passive_effect для накапливаемого состояния (баффы/дебаффы/статусы).

  • Используйте set_duration(...) для временных эффектов вместо ручных таймеров.

  • Всегда восстанавливайте любые изменённые состояния в effect_end (трение, масштаб, триггеры анимации и т.д.).

  • Держите чисто косметические Локальный UI/эффекты (оборачивайте в player->is_local()), и держите игровое состояние под контролем сервера.

Последнее обновление