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

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

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

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

  • Коротко «заблокировать» ввод игрока на время последовательности (еда, воскрешение, кат-сцена)

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

  • UI, привязанный к временному состоянию (обратный отсчёт до возрождения)

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

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 vs 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()), а состояние геймплея держите авторитетным на сервере.

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