Efectos
Los efectos toman temporalmente el control de una entidad para comportamientos complejos como dashes, ataques, animaciones de comer, cinemáticas o secuencias de muerte/reaparición.
Los efectos pueden usarse en jugadores, NPCs o cualquier entidad. Son especialmente útiles cuando quieres:
Movimiento que controlas en código (dash/retroceso/rodar)
"Bloquear" la entrada del jugador para una secuencia corta (comer, revivir, cinemática)
Una ventana temporizada de estado (invencibilidad, lentitud, aturdimiento)
UI vinculada a un estado temporal (cuenta atrás de reaparecer)
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: varios pueden adjuntarse a la vez (buffs/debuffs/efectos de estado apilables).
Inicio rápido (un efecto temporizado simple)
Crea una clase que herede de Effect_Base, y luego adjúntala 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,4 s
}
effect_update :: method(dt: float) {
t := get_elapsed_time() / 0.4;
// Aumentar la escala y luego encoger 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);
// Flotar ligeramente hacia arriba
rise := Ease.out_quad(t) * 0.5;
entity.set_local_position({start_pos.x, start_pos.y + rise});
// Desvanecer 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) {
// Limpiar al terminar (o al interrumpirse)
entity.destroy();
}
}Adjuntarlo como un efecto activo:
Ciclo de vida del efecto
Los efectos se basan en callbacks. Implementa solo lo que necesites:
effect_start(): se llama una vez cuando se adjunta el efectoeffect_update(dt): se llama en cada fotogramaeffect_late_update(dt): se llama en cada fotograma después deeffect_updateeffect_draw(dt): dibujo solo cosmético en fotogramas renderizableseffect_end(interrupt): se llama cuando se elimina el efecto
effect_draw incluye a los jugadores y omite la resimulación. La UI interactiva debe usar effect_update/effect_late_update, nunca effect_draw.
Efectos activos (control exclusivo)
Usa set_active_effect para efectos que deben ser mutuamente excluyentes (dash, preparación de ataque, secuencia de muerte).
Si la entidad ya tiene un efecto activo, este termina con interrupt = true.
Efectos pasivos (buffs/estado apilables)
Usa add_passive_effect para efectos que pueden apilarse (lentitud, veneno, escudo, ventana de invencibilidad).
Referencia de API
Effect_Base
Aplicar / eliminar efectos
Comprobar / iterar efectos
Después de llamar a remove_effect(...), el efecto se desacopla y deja de estar anclado. Su referencia deja de ser válida. Devuelve de inmediato y no accedas a this de nuevo.
freeze_player vs disable_movement_inputs
player_specific.freeze_player = true: bloquea por completo la posición del jugador.player_specific.disable_movement_inputs = true: ignora la entrada, pero tu efecto aún puede mover al jugador (dash/rodar).
Ambos solo se aplican cuando player != null (es decir, el efecto está en una entidad que tiene un Player componente).
Emotes del jugador
Las emotes del jugador usan un efecto activo integrado. Iniciar otra emote interrumpe la emote actual, mientras que cualquier otro efecto activo impide que se inicie una nueva emote. El movimiento interrumpe las emotes y restaura la capa principal de animación, excepto Emote/T_Pose, que permite movimiento.
Usa motivos de bloqueo cuando la jugabilidad deba impedir temporalmente que la rueda de emotes inicie una emote:
Los motivos se cuentan como entradas, así que es importante que las llamadas add/remove coincidan. remove_emote_block_reason elimina una entrada coincidente y devuelve si encontró una. Usa has_emote_block_reason(reason) para consultar un motivo y has_any_emote_block_reason() para consultar si hay alguno activo. También puedes controlar directamente el efecto integrado:
try_trigger_emote devuelve false cuando la animación no está equipada, las emotes están bloqueadas o otro tipo de efecto activo controla al jugador. La rueda normal de emotes usa esta misma ruta.
Ejemplos de efectos
Dash / rodar (efecto activo)
Ventana de invencibilidad (efecto pasivo)
Usa un efecto pasivo para representar el estado invencible, y compruébalo en cualquier lugar donde apliques daño.
2x de tamaño durante unos segundos (efecto pasivo)
Secuencia de muerte / reaparecer (efecto activo con UI local)
Bloqueo de cinemática (efecto activo)
Visuales personalizados suaves
La simulación se ejecuta a una tasa fija, mientras que el renderizado puede ir más rápido. Dibujar desde una devolución de llamada de componente se ancla automáticamente a la entidad de ese componente. Para otros casos:
Envuelve el dibujo en espacio mundial de otra entidad en
UI.begin_world_space_ui(entity)yUI.end_world_space_ui().Para una posición en movimiento que no pertenece a una entidad, mantén un
Position_Interpolation_Helper. Pasa el desplazamiento deupdate(position)aUI.push_interpolation_offset, y luego elimínalo después de dibujar.Usa un
Float_Interpolation_Helpercon los campospersistente para un valor de barra cambiante.persistenteLlama a
entity.mark_teleported()después de un cambio discontinuo de posición.
Mantén los ayudantes de interpolación en un componente persistente o en el estado de la UI. Un ayudante creado dentro del método draw no tiene un fotograma anterior desde el que interpolar.
Buenas prácticas
Usa
set_active_effectcuando el efecto “posee” la entidad durante una secuencia corta (dash/ataque/muerte/cinemática).Usa
add_passive_effectpara estado apilable (buffs/debuffs/estados).Usa
set_duration(...)para efectos temporizados en lugar de temporizadores manuales.Restaura siempre cualquier estado modificado en
effect_end(fricción, escala, disparadores de animación, etc.).Ejecuta los efectos de jugabilidad en la ruta predicha compartida.
effect_drawes solo cosmético. Dibuja la UI interactiva del efecto desde la del jugadormétodo ao_late_updateenis_local_or_server().
Última actualización