En esta sección aprenderás a utilizar temporizadores y eventos retardados en Phaser, herramientas fundamentales para controlar el tiempo dentro de tus juegos. Los temporizadores permiten ejecutar acciones después de un intervalo específico, crear bucles temporizados, programar eventos recurrentes y mucho más. Dominar estos conceptos te permitirá añadir dinamismo y control preciso sobre la jugabilidad.
Conceptos Clave
- Temporizador (Timer): Mecanismo que ejecuta una función después de un tiempo determinado.
- Evento Retardado (Delayed Event): Acción programada para ocurrir tras un retraso específico.
- Repetición (Loop): Ejecución periódica de una función a intervalos regulares.
- Cancelación: Detener un temporizador antes de que se ejecute o mientras está en curso.
Temporizadores en Phaser: Métodos Principales
Phaser proporciona varias formas de trabajar con el tiempo. Las más comunes son:
Método/Objeto | Descripción |
---|---|
scene.time.addEvent |
Crea un evento temporizado (único o repetitivo). |
scene.time.delayedCall |
Ejecuta una función una sola vez después de un retraso. |
scene.time.removeEvent |
Elimina un evento temporizado antes de que ocurra. |
scene.time.now |
Devuelve el tiempo actual (en ms) desde el inicio de la escena. |
Ejemplo Básico: Evento Retardado Único
Supongamos que quieres mostrar un mensaje 2 segundos después de iniciar la escena.
// Dentro de una escena de Phaser this.time.delayedCall(2000, () => { console.log('¡Han pasado 2 segundos!'); }, [], this);
Explicación:
2000
es el tiempo de espera en milisegundos (2 segundos).- La función flecha se ejecuta después del retraso.
- El tercer parámetro es un array de argumentos (vacío en este caso).
- El cuarto parámetro es el contexto (
this
), necesario para acceder a la escena.
Ejemplo: Evento Repetitivo (Loop)
Para ejecutar una acción cada segundo, usa addEvent
con la opción loop: true
:
this.time.addEvent({ delay: 1000, // 1 segundo callback: () => { console.log('¡Un segundo ha pasado!'); }, callbackScope: this, loop: true });
Explicación:
delay
: Intervalo entre ejecuciones (en ms).callback
: Función a ejecutar.callbackScope
: Contexto de la función.loop: true
: Hace que el evento se repita indefinidamente.
Ejemplo: Temporizador con Contador de Repeticiones
Puedes limitar el número de repeticiones usando la propiedad repeat
:
this.time.addEvent({ delay: 500, // 0.5 segundos callback: () => { console.log('¡Medio segundo ha pasado!'); }, callbackScope: this, repeat: 4 // Se ejecuta 5 veces en total (0 a 4) });
Nota: El evento se ejecuta repeat + 1
veces.
Cancelar un Temporizador
Guarda la referencia al evento para poder cancelarlo más tarde:
let myEvent = this.time.addEvent({ delay: 1000, callback: () => { console.log('Esto podría cancelarse'); }, callbackScope: this, loop: true }); // Para cancelar: myEvent.remove();
Tabla Comparativa: Métodos de Temporización
Método | Único/Loop | ¿Devuelve referencia? | ¿Puede cancelarse? | Uso típico |
---|---|---|---|---|
scene.time.delayedCall |
Único | Sí | Sí | Acciones únicas tras un retraso |
scene.time.addEvent |
Ambos | Sí | Sí | Acciones repetitivas o únicas |
Ejercicio Práctico
Enunciado:
Crea una escena en la que, al iniciar, aparezca un texto que diga "¡Prepárate!". Después de 3 segundos, el texto debe cambiar a "¡Comienza el juego!". Además, cada segundo, muestra en consola el tiempo transcurrido desde el inicio de la escena, durante 5 segundos.
Solución Propuesta
class TemporizadoresEscena extends Phaser.Scene { constructor() { super({ key: 'TemporizadoresEscena' }); } create() { // Mostrar el texto inicial this.texto = this.add.text(100, 100, '¡Prepárate!', { fontSize: '32px', fill: '#fff' }); // Cambiar el texto después de 3 segundos this.time.delayedCall(3000, () => { this.texto.setText('¡Comienza el juego!'); }, [], this); // Contador de segundos let segundos = 0; this.time.addEvent({ delay: 1000, callback: () => { segundos++; console.log(`Han pasado ${segundos} segundos`); }, callbackScope: this, repeat: 4 // 5 veces en total (0 a 4) }); } }
Explicación:
- Se crea un texto inicial.
- Se usa
delayedCall
para cambiar el texto tras 3 segundos. - Se usa
addEvent
conrepeat: 4
para mostrar el tiempo transcurrido cada segundo, durante 5 segundos.
Errores Comunes y Consejos
- Olvidar el contexto (
callbackScope
): Si no lo defines,this
dentro del callback puede no referirse a la escena. - Confundir
repeat
con número de ejecuciones: Recuerda querepeat: 4
ejecuta el callback 5 veces. - No guardar la referencia al evento: Si necesitas cancelar un temporizador, guarda la referencia al crearlo.
- Demasiados temporizadores activos: Usa temporizadores solo cuando sea necesario para evitar sobrecargar la escena.
Resumen
- Los temporizadores y eventos retardados permiten ejecutar acciones tras un retraso o de forma periódica.
- Usa
delayedCall
para acciones únicas yaddEvent
para acciones repetitivas o más configurables. - Siempre define el contexto (
callbackScope
) para evitar errores conthis
. - Puedes cancelar eventos guardando su referencia.
- Estos mecanismos son esenciales para crear dinámicas de juego como cuenta regresiva, generación de enemigos, animaciones temporizadas, etc.
¡Ahora estás listo para controlar el tiempo en tus juegos con Phaser!
En la próxima sección aprenderás sobre IA y comportamiento de enemigos, donde los temporizadores serán aún más útiles.
Phaser - Desarrollo de Juegos con JavaScript
Módulo 1: Introducción al Desarrollo de Juegos y Phaser
- ¿Qué es el Desarrollo de Juegos?
- Descripción general de Phaser
- Configurando tu Entorno de Desarrollo
- Tu Primer Proyecto con Phaser
Módulo 2: Fundamentos de Phaser
- Entendiendo el Bucle de Juego
- Configuración del Juego y Escenas
- Cargando y Mostrando Imágenes
- Trabajando con Texto
- Manejo de Entrada (Teclado y Ratón)
Módulo 3: Sprites y Animación
- ¿Qué son los Sprites?
- Añadiendo y Moviendo Sprites
- Fundamentos de Animación de Sprites
- Grupos de Sprites y Gestión
Módulo 4: Física e Interactividad en el Juego
- Introducción a la Física en Phaser
- Habilitando Física en Sprites
- Colisiones y Superposiciones
- Objetos Interactivos y Eventos
Módulo 5: Mundo del Juego y Cámara
- Creando Tilemaps y Mundos de Juego
- Desplazamiento y Control de Cámara
- Capas y Gestión de Profundidad
Módulo 6: Audio e Interfaz de Usuario
Módulo 7: Arquitectura del Juego y Gestión de Estados
- Organizando el Código del Juego
- Gestionando Múltiples Escenas
- Guardando y Cargando el Estado del Juego
Módulo 8: Características Avanzadas de Jugabilidad
- Efectos de Partículas
- Tweens y Animaciones
- Temporizadores y Eventos Retardados
- IA y Comportamiento de Enemigos