El Time Manager

El Time Manager proporciona el tiempo transcurrido entre frames (delta time), una escala de tiempo global y temporizadores repetitivos (intervalos).

En los sistemas que extienden GameSystem está disponible como this.timeManager. Consulta Componentes y sistemas personalizados.

Delta time

El delta time es el tiempo transcurrido entre el frame anterior y el actual, en segundos. Multiplicar el movimiento y otras tasas por el delta time las mantiene consistentes independientemente de la frecuencia de frames.

import { GameSystem, Transform } from "angry-pixel";
import { Player } from "../component/Player";

export class PlayerSystem extends GameSystem {
    onUpdate() {
        this.entityManager.search(Player, (player, entity) => {
            const transform = this.entityManager.getComponent(entity, Transform);
            transform.position.x += player.speed * this.timeManager.deltaTime;
        });
    }
}

Los valores disponibles son:

MiembroDescripción
deltaTimeTiempo entre frames, en segundos. Afectado por timeScale. Úsalo en los sistemas de lógica de juego.
physicsDeltaTimeTiempo entre frames de física, en segundos. Afectado por timeScale. Úsalo en los sistemas de física.
renderDeltaTimeTiempo de frame del navegador, en segundos. Afectado por timeScale.
unscaledDeltaTimedeltaTime sin verse afectado por timeScale.
unscaledPhysicsDeltaTimephysicsDeltaTime sin verse afectado por timeScale.
unscaledRenderDeltaTimerenderDeltaTime sin verse afectado por timeScale.
browserDeltaTimeTiempo entre frames del navegador, en segundos.

Escala de tiempo

timeScale controla la velocidad a la que transcurre el tiempo. El valor por defecto es 1. Establecerlo en 2 hace que el tiempo transcurra al doble de velocidad, 0.5 a la mitad, y 0 detiene todo lo relacionado con el tiempo.

// pausar el movimiento basado en el tiempo
this.timeManager.timeScale = 0;

// cámara lenta
this.timeManager.timeScale = 0.5;

timeScale afecta a deltaTime, physicsDeltaTime y renderDeltaTime. Los valores unscaled* lo ignoran.

Intervalos

setInterval ejecuta un callback repetidamente con un retardo fijo y devuelve un id de intervalo. clearInterval detiene uno por su id, y clearAllIntervals los detiene todos.

const intervalId = this.timeManager.setInterval({
    callback: () => console.log("llamado cada segundo"),
    delay: 1000,
});

this.timeManager.clearInterval(intervalId);

setInterval acepta las siguientes opciones:

OpciónTipoDescripción
callback() => voidLa función a ejecutar en cada intervalo.
delaynumberTiempo entre ejecuciones, en milisegundos.
timesnumberNúmero opcional de ejecuciones antes de que el intervalo se cancele a sí mismo. Omítelo para un intervalo indefinido.
executeImmediatelybooleanEjecuta el callback inmediatamente antes de iniciar el temporizador.
entityRefEntityCancela el intervalo cuando la entidad se desactiva o se destruye.
componentRefComponentCancela el intervalo cuando el componente se desactiva o se destruye.
useTimeScalebooleanSi el intervalo se ve afectado por timeScale. Por defecto true.
// se ejecuta cinco veces y luego se cancela automáticamente
this.timeManager.setInterval({
    callback: () => spawnEnemy(),
    delay: 2000,
    times: 5,
});

Nota: Todos los intervalos se cancelan cuando se carga una nueva escena.