El cronómetro que no miente
Casi todo el mundo escribe su primer cronómetro así:
update() {
this.segundos += 1 / 60
this.texto.setText(this.segundos.toFixed(1))
}
Y funciona. En tu máquina. En un monitor de 60 Hz. El día que alguien lo abre en una laptop gamer de 144 Hz, tu cronómetro corre a más del doble de velocidad, y el jugador que "rompió el récord" en realidad tuvo 2.4 veces más tiempo.
Qué tienes que construir
Una sola escena con un número grande al centro que cuente segundos hacia arriba, con un decimal, y tres teclas:
- Espacio — pausa y reanuda.
- R — regresa a cero.
- D — activa y desactiva un modo de "frenado" que hace trabajo falso en cada frame para tirar los FPS a propósito (un
forque gire unos cuantos millones de veces sirve).
Ese modo D es la parte importante del ejercicio: es tu banco de pruebas. Sin él no puedes demostrar que tu cronómetro es correcto, solo suponerlo.
Criterios de aceptación
- Con el modo de frenado apagado, el cronómetro marca 10.0 cuando han pasado 10 segundos de reloj de pared. Compruébalo contra el cronómetro de tu teléfono, no contra tu intuición.
- Con el modo de frenado encendido —y con los FPS visiblemente por los suelos— el cronómetro sigue marcando 10.0 a los 10 segundos reales. La diferencia entre ambas corridas tiene que ser menor a 0.2 s.
- Pausar y reanudar tres veces seguidas no adelanta ni atrasa el conteo.
- El número no parpadea ni salta hacia atrás en ningún momento.
- En ninguna parte de tu código aparece el número
60.
Ese último punto es el que hace el ejercicio. Si te hace falta el 60, es que todavía estás asumiendo cuántas veces por segundo corre update.
Pistas
En Phaser, update(time, delta) te entrega delta en milisegundos desde el frame anterior. Ese es todo el secreto: acumulas delta, no frames.
update(time, delta) {
if (this.pausado) return
this.ms += delta
}
Dos trampas que vas a encontrar:
toFixed(1)sobre un número que crece por milisegundos parpadea si lo actualizas en cada frame con un valor que cambia poco. Actualiza el texto solo cuando el décimo de segundo cambie de verdad.- Al reanudar después de pausar, si guardaste un tiempo absoluto en lugar de acumular, vas a sumar de golpe todo el rato que estuvo pausado. Acumular
deltaesquiva ese problema entero, que es justo por qué se hace así.
Cuando ya te salió
Agrega un cuarto modo: cámara lenta. Una tecla que multiplique el paso del tiempo por 0.25 para todo lo que se mueva en la escena, pero que deje el cronómetro corriendo a velocidad real.
Eso te obliga a separar dos relojes que hasta ahora eran el mismo: el tiempo del juego y el tiempo del mundo. Es exactamente la distinción que necesitas más adelante para hacer un hitstop que se sienta bien, y es la razón por la que casi ningún juego usa delta a pelo en todos lados.
Sigue con estos
Un sprite que camina y se detiene
Un personaje que corre cuando lo mueves y se queda quieto cuando lo sueltas, sin que la animación se reinicie sola ni se quede pegada en medio del paso.
- Sprites
- Input
Monedas que no se cuentan dos veces
Veinte monedas, un marcador y un bug que aparece solo cuando el jugador es lento: la moneda que suma tres veces porque tardaste tres frames en salir de ella.
- Colisiones
- UI y estado
Una cámara que sigue sin marear
Pegar la cámara al personaje es una línea. Que no se sienta como ir en el asiento de atrás de un taxi es el ejercicio.
- Cámara