Jugable
Apuntarme

Una cámara que sigue sin marear

  • Nivel: ya programo
  • Cámara
  • 2 min de lectura

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:

  1. Suavizado — la cámara persigue, no está pegada.
  2. Zona muerta — un rectángulo al centro dentro del cual el personaje se mueve sin que la cámara reaccione.
  3. Límites — la cámara nunca muestra fuera del nivel.
  4. 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

  1. Con todo apagado y todo prendido, el mismo recorrido se ve claramente distinto. Si no notas la diferencia, algo no está conectado.
  2. Saltar en el mismo sitio no mueve la cámara verticalmente. Este es el más importante y el que más se siente.
  3. Caminar en el extremo izquierdo del nivel no muestra nada más allá del borde: ni vacío negro ni el fondo cortado.
  4. Al cambiar de dirección, la cámara se reacomoda al lado contrario de forma suave, sin un tirón.
  5. 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.
  • setFollowOffset cambiado 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

Ver el catálogo completo

Empiezo

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
Leer el ejercicio Sin repo todavía
Empiezo

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
Leer el ejercicio Sin repo todavía
Empiezo

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
Leer el ejercicio Sin repo todavía

El próximo grupo

Un día
y un juego tuyo

Presencial en Tijuana

Cupo limitado por grupo

apartar lugar