En los juegos 2D, especialmente aquellos con mundos más grandes que la pantalla, el desplazamiento de cámara es fundamental para ofrecer una experiencia inmersiva. Phaser proporciona un sistema de cámaras flexible que te permite seguir personajes, explorar mapas y crear efectos visuales dinámicos.
En esta lección aprenderás:
- Qué es una cámara en Phaser y por qué es importante.
- Cómo mover la cámara manualmente y cómo hacer que siga a un objeto.
- Cómo limitar el movimiento de la cámara.
- Ejemplos prácticos y ejercicios para dominar el control de cámara.
- ¿Qué es una Cámara en Phaser?
En Phaser, la cámara es la "ventana" a través de la cual el jugador ve el mundo del juego. Aunque el mundo puede ser mucho más grande que la pantalla, la cámara determina qué parte se muestra en cada momento.
Conceptos clave:
- Cámara principal (
this.cameras.main
): Es la cámara por defecto en cada escena. - Viewport: El área visible del mundo del juego.
- Scroll: El desplazamiento de la cámara sobre el mundo.
Concepto | Descripción |
---|---|
Cámara principal | La cámara por defecto en cada escena de Phaser. |
Viewport | El área visible del mundo del juego en la pantalla. |
Scroll | El desplazamiento de la cámara sobre el mundo, cambiando la vista del jugador. |
- Moviendo la Cámara Manualmente
Puedes mover la cámara cambiando sus propiedades de scroll (scrollX
y scrollY
).
Ejemplo Básico
// Mover la cámara 100 píxeles a la derecha y 50 hacia abajo this.cameras.main.scrollX = 100; this.cameras.main.scrollY = 50;
Explicación:
scrollX
yscrollY
determinan la posición superior izquierda de la cámara en el mundo del juego.- Cambiando estos valores, puedes desplazar la vista.
- Haciendo que la Cámara Siga a un Objeto
Una de las características más útiles es hacer que la cámara siga automáticamente a un sprite (por ejemplo, el jugador).
Ejemplo: Seguir al Jugador
Explicación:
startFollow(objeto)
hace que la cámara siga el objeto especificado.- La cámara se moverá automáticamente para mantener el objeto en el centro (o según la configuración).
Opciones de Seguimiento
Puedes personalizar el seguimiento con opciones adicionales:
- El tercer y cuarto parámetro (
0.08, 0.08
) son los factores de suavizado (lerp) en X e Y. - Valores más bajos hacen que la cámara siga al objeto de manera más suave y retardada.
- Limitar el Movimiento de la Cámara
Para evitar que la cámara muestre áreas fuera del mundo del juego, puedes establecer límites:
// Limita la cámara al tamaño del mundo (por ejemplo, 2000x1000 píxeles) this.cameras.main.setBounds(0, 0, 2000, 1000);
Explicación:
setBounds(x, y, width, height)
define el área máxima por la que la cámara puede desplazarse.
- Zoom y Efectos de Cámara
La cámara también puede hacer zoom y aplicar efectos visuales.
Zoom
Efectos (Opcional)
Phaser permite efectos como parpadeo, sacudida, etc. Ejemplo de sacudida:
- Ejemplo Completo: Mundo Desplazable con Cámara que Sigue al Jugador
class MyGameScene extends Phaser.Scene { preload() { this.load.image('player', 'assets/player.png'); this.load.image('background', 'assets/background.png'); } create() { // Crea un mundo más grande que la pantalla this.add.image(1000, 500, 'background').setDisplaySize(2000, 1000); // Crea el jugador this.player = this.physics.add.sprite(100, 100, 'player'); // Habilita los límites del mundo this.physics.world.setBounds(0, 0, 2000, 1000); this.player.setCollideWorldBounds(true); // Configura la cámara this.cameras.main.setBounds(0, 0, 2000, 1000); this.cameras.main.startFollow(this.player, true, 0.1, 0.1); this.cameras.main.setZoom(1.2); // Controles básicos this.cursors = this.input.keyboard.createCursorKeys(); } update() { // Movimiento del jugador this.player.setVelocity(0); if (this.cursors.left.isDown) { this.player.setVelocityX(-200); } else if (this.cursors.right.isDown) { this.player.setVelocityX(200); } if (this.cursors.up.isDown) { this.player.setVelocityY(-200); } else if (this.cursors.down.isDown) { this.player.setVelocityY(200); } } }
Explicación:
- El mundo es de 2000x1000 píxeles, más grande que la pantalla.
- El jugador puede moverse libremente y la cámara lo sigue suavemente.
- La cámara no puede salir de los límites del mundo.
- Ejercicios Prácticos
Ejercicio 1: Desplazamiento Manual de Cámara
Instrucciones:
Crea una escena donde puedas mover la cámara usando las teclas de flecha, sin mover ningún sprite.
Pista:
Utiliza this.cameras.main.scrollX
y scrollY
en el método update()
.
Solución
class CameraScrollScene extends Phaser.Scene { create() { this.cursors = this.input.keyboard.createCursorKeys(); } update() { if (this.cursors.left.isDown) { this.cameras.main.scrollX -= 5; } else if (this.cursors.right.isDown) { this.cameras.main.scrollX += 5; } if (this.cursors.up.isDown) { this.cameras.main.scrollY -= 5; } else if (this.cursors.down.isDown) { this.cameras.main.scrollY += 5; } } }
Consejo:
Asegúrate de establecer límites con setBounds
para evitar que la cámara muestre áreas vacías.
Ejercicio 2: Limitar la Cámara a un Área Específica
Instrucciones:
Configura la cámara para que no pueda salir de un área de 1500x800 píxeles, aunque el mundo sea más grande.
Solución
Error común:
Olvidar que los límites de la cámara deben ser menores o iguales al tamaño del mundo.
Ejercicio 3: Zoom Dinámico
Instrucciones:
Permite que el jugador acerque o aleje la cámara usando las teclas "+" y "-".
Solución
create() { this.input.keyboard.on('keydown-PLUS', () => { this.cameras.main.setZoom(this.cameras.main.zoom + 0.1); }); this.input.keyboard.on('keydown-MINUS', () => { this.cameras.main.setZoom(this.cameras.main.zoom - 0.1); }); }
Consejo:
Limita el zoom mínimo y máximo para evitar valores extremos.
- Resumen
En esta lección aprendiste:
- Qué es la cámara en Phaser y cómo controla la vista del jugador.
- Cómo desplazar la cámara manualmente y cómo hacer que siga a un objeto.
- Cómo limitar el movimiento de la cámara y aplicar zoom.
- Ejercicios prácticos para afianzar el control de la cámara.
¡Ahora puedes crear mundos de juego más grandes y dinámicos, y controlar exactamente lo que el jugador ve!
En la próxima lección aprenderás sobre capas y gestión de profundidad, para organizar visualmente los elementos de tu juego.
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