Una cámara que sigue sin marear
this.cameras.main.startFollow(jugador) es una línea y es lo que hace todo el mundo. El resultado se siente mal y cuesta trabajo explicar por qué: la cámara copia cada temblor del personaje, así que el fondo nunca se queda quieto y a los diez minutos duele la cabeza.
Las cámaras buenas hacen tres cosas que esa línea no hace.
Qué tienes que construir
Un nivel horizontal de unos 4000 px de ancho, con fondo que se note (postes, árboles, lo que sea, pero no un color plano — necesitas referencia visual), y un personaje que corre, salta y cae. Sobre eso, una cámara con:
- Suavizado — la cámara persigue, no está pegada.
- Zona muerta — un rectángulo al centro dentro del cual el personaje se mueve sin que la cámara reaccione.
- Límites — la cámara nunca muestra fuera del nivel.
- Adelanto — mirando hacia donde el personaje va, no donde está.
Y una tecla que active y desactive los cuatro, para poder comparar.
Criterios de aceptación
- Con todo apagado y todo prendido, el mismo recorrido se ve claramente distinto. Si no notas la diferencia, algo no está conectado.
- Saltar en el mismo sitio no mueve la cámara verticalmente. Este es el más importante y el que más se siente.
- Caminar en el extremo izquierdo del nivel no muestra nada más allá del borde: ni vacío negro ni el fondo cortado.
- Al cambiar de dirección, la cámara se reacomoda al lado contrario de forma suave, sin un tirón.
- Frenar en seco no hace que la cámara rebase al personaje y regrese.
Pistas
Phaser ya trae las cuatro piezas; el ejercicio es entender qué hace cada una.
const cam = this.cameras.main
cam.startFollow(jugador, true, 0.08, 0.08) // los dos últimos son el lerp
cam.setDeadzone(180, 140)
cam.setBounds(0, 0, 4000, 600)
cam.setFollowOffset(-mirandoHacia * 90, 0)
- El lerp (
0.08) es qué fracción de la distancia restante se recorre por frame. Más bajo = más suave y más retrasado. Ojo: como está por frame y no por segundo, en un monitor de 144 Hz la cámara es más rápida que en uno de 60. Si te importa, es el mismo problema que el del cronómetro. - La zona muerta vertical es lo que arregla el salto. Hazla más alta que el salto máximo del personaje y el brinco deja de mover el mundo.
setFollowOffsetcambiado de golpe al voltear produce el tirón del criterio 4. Interpólalo tú, no lo asignes directo.
Prueba los valores con el nivel corriendo, no a ojo en el código. Un buen tacto de cámara son diez minutos de mover números.
Cuando ya te salió
Haz que la zona muerta crezca cuando el personaje corre rápido y se encoja cuando va lento o está quieto.
El efecto es que en persecuciones ves más adelante y en momentos de calma la cámara se centra en el personaje. Es un truco que usan muchos juegos de plataformas y que casi nadie nota conscientemente — que es exactamente la señal de que una cámara está bien hecha.
Sigue con estos
El cronómetro que no miente
Un contador en pantalla que marque exactamente los mismos segundos en un monitor de 60 Hz y en uno de 144 Hz. Suena trivial hasta que lo mides.
- Game loop
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