wand-magic-sparklesEfectos

Los efectos toman temporalmente el control de una entidad para comportamientos complejos como embestidas, ataques, animaciones de comer, escenas cinemáticas o secuencias de muerte/respawn.

Los efectos pueden usarse en jugadores, NPCs o cualquier entidad. Son especialmente útiles cuando quieres:

  • Movimiento que controlas en código (embestida/retroceso/rodar)

  • “Bloquear” la entrada del jugador por una secuencia corta (comer, revivir, escena cinemática)

  • Una ventana temporal de estado (invencibilidad, lentitud, aturdimiento)

  • Interfaz de usuario vinculada a un estado temporal (cuenta regresiva de respawn)

Activos vs pasivos

All Out admite dos tipos de efectos:

  • Efectos activos: uno a la vez por entidad. Establecer un nuevo efecto activo interrumpe el efecto activo actual.

  • Efectos pasivos: se pueden adjuntar múltiples a la vez (mejoras/penalizaciones/aplicaciones de estado apilables).

circle-info

Un efecto activo también se inserta en la lista de efectos de la entidad, por lo que aparece en effect_iterator igual que los efectos pasivos.

Inicio rápido (un efecto temporal simple)

Crea una clase que herede de Effect_Base, luego adjúntalo a una entidad.

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); // se elimina automáticamente después de 0.4s
    }

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

        // Aumenta la escala y luego encoge hasta desaparecer
        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);

        // Flota hacia arriba ligeramente
        rise := Ease.out_quad(t) * 0.5;
        entity->set_local_position({start_pos.x, start_pos.y + rise});

        // Desvanece cerca del final
        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) {
        // Limpia cuando termina (o se interrumpe)
        entity->destroy();
    }
}

Adjúntalo como un efecto activo:

Ciclo de vida del efecto

Los efectos se basan en callbacks. Implementa solo lo que necesites:

  • effect_start(): llamado una vez cuando se adjunta el efecto

  • effect_update(dt): llamado cada fotograma

  • effect_late_update(dt): llamado cada fotograma después de effect_update

  • effect_end(interrupt): llamado cuando se elimina el efecto

Efectos activos (control exclusivo)

Usa set_active_effect para efectos que deben ser mutuamente excluyentes (embestida, preparación de ataque, secuencia de muerte).

Si la entidad ya tiene un efecto activo, se finaliza con interrupt = true.

Efectos pasivos (mejoras/aplicaciones de estado apilables)

Usa add_passive_effect para efectos que pueden apilarse (lentitud, veneno, escudo, ventana de invencibilidad).

Referencia de la API

Effect_Base

Aplicar / eliminar efectos

Comprobar / iterar efectos

circle-exclamation

freeze_player vs disable_movement_inputs

  • player_specific.freeze_player = true: bloquea completamente la posición del jugador.

  • player_specific.disable_movement_inputs = true: ignora la entrada, pero tu efecto aún puede mover al jugador (embestida/rodar).

Ambos solo se aplican cuando player != null (es decir, el efecto está en una entidad que tiene un Player componente).

Ejemplos de efectos

Embestida / rodar (efecto activo)

Ventana de invencibilidad (efecto pasivo)

Usa un efecto pasivo para representar el estado invencible y compruébalo donde sea que apliques daño.

2x de tamaño por unos segundos (efecto pasivo)

Secuencia de muerte / respawn (efecto activo con IU local)

Bloqueo de escena cinemática (efecto activo)

Mejores prácticas

  • Usa set_active_effect cuando el efecto “posee” la entidad por una secuencia corta (embestida/ataque/muerte/escena cinematográfica).

  • Usa add_passive_effect para estado apilable (mejoras/penalizaciones/estados).

  • Usa set_duration(...) para efectos temporizados en lugar de temporizadores manuales.

  • Siempre restaura cualquier estado modificado en effect_end (fricción, escala, disparadores de animación, etc.).

  • Mantén puramente cosméticos IU/efectos locales (envuélvelos en player->is_local()), y mantén el estado del juego autoritativo en el servidor.

Última actualización