journey
title Tu Viaje de Detección de Colisiones
section Fundamentos de Física
Entender rectángulos: 3: Student
Aprender matemáticas de intersección: 4: Student
Comprender sistemas de coordenadas: 4: Student
section Mecánicas de Juego
Implementar disparo láser: 4: Student
Añadir ciclo de vida de objetos: 5: Student
Crear reglas de colisión: 5: Student
section Integración del Sistema
Construir detección de colisiones: 5: Student
Optimizar rendimiento: 5: Student
Probar sistemas de interacción: 5: Student
Cuestionario previo a la lección
Piensa en el momento en Star Wars cuando los torpedos de protones de Luke alcanzan el puerto de escape de la Estrella de la Muerte. ¡Esa detección precisa de colisiones cambió el destino de la galaxia! En los juegos, la detección de colisiones funciona igual: determina cuándo los objetos interactúan y qué sucede después.
En esta lección, añadirás armas láser a tu juego espacial e implementarás la detección de colisiones. Al igual que los planificadores de misiones de la NASA calculan las trayectorias de las naves para evitar escombros, aprenderás a detectar cuándo los objetos del juego se intersectan. Lo desglosaremos en pasos manejables que se construyen unos sobre otros.
Al final, tendrás un sistema de combate funcional donde los láseres destruyen enemigos y las colisiones activan eventos en el juego. Estos mismos principios de colisiones se usan en todo, desde simulaciones físicas hasta interfaces web interactivas.
mindmap
root((Detección de Colisiones))
Physics Concepts
Límites Rectangulares
Pruebas de Intersección
Sistemas de Coordenadas
Lógica de Separación
Game Objects
Proyectiles Láser
Naves Enemigas
Personaje Héroe
Zonas de Colisión
Lifecycle Management
Creación de Objetos
Actualizaciones de Movimiento
Marcado de Destrucción
Limpieza de Memoria
Event Systems
Entrada de Teclado
Eventos de Colisión
Cambios de Estado del Juego
Efectos Audio/Visuales
Performance
Algoritmos Eficientes
Optimización de Tasa de Fotogramas
Gestión de Memoria
Particionamiento Espacial
✅ Investiga un poco sobre el primer juego de computadora jamás escrito. ¿Cuál era su funcionalidad?
La detección de colisiones funciona como los sensores de proximidad en el módulo lunar Apolo: revisa constantemente las distancias y activa alertas cuando los objetos se acercan demasiado. En los juegos, este sistema determina cuándo los objetos interactúan y qué debe pasar después.
El enfoque que usaremos trata cada objeto del juego como un rectángulo, similar a cómo los sistemas de control de tráfico aéreo usan formas geométricas simplificadas para rastrear aviones. Este método rectangular puede parecer básico, pero es computacionalmente eficiente y funciona bien para la mayoría de los escenarios de juegos.
Cada objeto del juego necesita límites de coordenadas, similar a cómo el rover Mars Pathfinder mapeó su ubicación en la superficie marciana. Así definimos estas coordenadas límite:
flowchart TD
A["🎯 Objeto de Juego"] --> B["📍 Posición (x, y)"]
A --> C["📏 Dimensiones (ancho, alto)"]
B --> D["Arriba: y"]
B --> E["Izquierda: x"]
C --> F["Abajo: y + alto"]
C --> G["Derecha: x + ancho"]
D --> H["🔲 Límites del Rectángulo"]
E --> H
F --> H
G --> H
H --> I["Detección de Colisiones Lista"]
style A fill:#e3f2fd
style H fill:#e8f5e8
style I fill:#fff3e0
rectFromGameObject() {
return {
top: this.y,
left: this.x,
bottom: this.y + this.height,
right: this.x + this.width
}
}Vamos a desglosarlo:
- Borde superior: Es justo donde comienza tu objeto verticalmente (su posición y)
- Borde izquierdo: Dónde comienza horizontalmente (su posición x)
- Borde inferior: Suma la altura a la posición y — ¡ahora sabes dónde termina!
- Borde derecho: Suma el ancho a la posición x — y tienes el límite completo
Detectar intersecciones de rectángulos usa una lógica similar a cómo el Telescopio Espacial Hubble determina si objetos celestes se superponen en su campo visual. El algoritmo verifica separación:
flowchart LR
A["Rectángulo 1"] --> B{"Pruebas de Separación"}
C["Rectángulo 2"] --> B
B --> D["¿R2 izquierda > R1 derecha?"]
B --> E["¿R2 derecha < R1 izquierda?"]
B --> F["¿R2 arriba > R1 abajo?"]
B --> G["¿R2 abajo < R1 arriba?"]
D --> H{"¿Alguna Verdadera?"}
E --> H
F --> H
G --> H
H -->|Sí| I["❌ Sin Colisión"]
H -->|No| J["✅ Colisión Detectada"]
style B fill:#e3f2fd
style I fill:#ffebee
style J fill:#e8f5e8
function intersectRect(r1, r2) {
return !(r2.left > r1.right ||
r2.right < r1.left ||
r2.top > r1.bottom ||
r2.bottom < r1.top);
}La prueba de separación funciona como los sistemas de radar:
- ¿Está el rectángulo 2 completamente a la derecha del rectángulo 1?
- ¿Está el rectángulo 2 completamente a la izquierda del rectángulo 1?
- ¿Está el rectángulo 2 completamente debajo del rectángulo 1?
- ¿Está el rectángulo 2 completamente por encima del rectángulo 1?
Si ninguna de estas condiciones se cumple, los rectángulos deben estar superpuestos. Este enfoque refleja cómo los operadores de radar determinan si dos aviones están a distancias seguras.
Cuando un láser impacta a un enemigo, ambos objetos deben ser eliminados del juego. Sin embargo, eliminar objetos en medio de un ciclo puede causar fallos—una lección aprendida de forma dura en los primeros sistemas como la Computadora de Guía Apolo. En cambio, usamos un enfoque de "marcar para eliminar" que remueve los objetos de forma segura entre fotogramas.
stateDiagram-v2
[*] --> Active: Objeto Creado
Active --> Collided: Colisión Detectada
Collided --> MarkedDead: Establecer dead = true
MarkedDead --> Filtered: Siguiente Fotograma
Filtered --> [*]: Objeto Eliminado
Active --> OutOfBounds: Sale de la Pantalla
OutOfBounds --> MarkedDead
note right of MarkedDead
Seguro para continuar
fotograma actual
end note
note right of Filtered
Objetos eliminados
entre fotogramas
end note
Así es como marcamos algo para eliminación:
// Marcar objeto para eliminación
enemy.dead = true;Por qué funciona este enfoque:
- Marcamos el objeto como "muerto" pero no lo eliminamos inmediatamente
- Esto permite que el fotograma actual del juego termine con seguridad
- ¡No hay fallos por intentar usar algo que ya no existe!
Luego filtramos los objetos marcados antes del siguiente ciclo de renderizado:
gameObjects = gameObjects.filter(go => !go.dead);Qué hace este filtrado:
- Crea una lista nueva solo con los objetos "vivos"
- Elimina todo lo marcado como muerto
- Mantiene tu juego funcionando sin problemas
- Previene la acumulación de objetos destruidos que sobran en memoria
Los proyectiles láser en juegos funcionan bajo el mismo principio que los torpedos de fotones en Star Trek: son objetos discretos que viajan en línea recta hasta impactar algo. Cada vez que presionas la barra espaciadora, se crea un nuevo objeto láser que se mueve por la pantalla.
Para que esto funcione, necesitamos coordinar algunas piezas diferentes:
Componentes clave para implementar:
- Crear objetos láser que aparecen desde la posición del héroe
- Manejar la entrada del teclado para disparar láseres
- Gestionar el movimiento y ciclo de vida de los láseres
- Implementar la representación visual para los proyectiles láser
Una tasa de disparo ilimitada sobrecargaría el motor del juego y haría que jugar fuera demasiado fácil. Los sistemas de armas reales enfrentan restricciones similares: incluso los phasers del USS Enterprise necesitaban tiempo para recargarse entre disparos.
Implementaremos un sistema de enfriamiento que previene disparos a ráfaga mientras mantiene controles responsivos:
sequenceDiagram
participant Player
participant Weapon
participant Cooldown
participant Game
Player->>Weapon: Presionar Barra Espaciadora
Weapon->>Cooldown: Comprobar si está listo
alt Arma está Lista
Cooldown->>Weapon: listo = true
Weapon->>Game: Crear Láser
Weapon->>Cooldown: Iniciar nuevo tiempo de espera
Cooldown->>Cooldown: listo = false
Note over Cooldown: Esperar 500ms
Cooldown->>Cooldown: listo = true
else Arma está Enfriando
Cooldown->>Weapon: listo = false
Weapon->>Player: Sin acción
end
class Cooldown {
constructor(time) {
this.cool = false;
setTimeout(() => {
this.cool = true;
}, time);
}
}
class Weapon {
constructor() {
this.cooldown = null;
}
fire() {
if (!this.cooldown || this.cooldown.cool) {
// Crear proyectil láser
this.cooldown = new Cooldown(500);
} else {
// El arma todavía se está enfriando
}
}
}Cómo funciona el enfriamiento:
- Cuando se crea, el arma está "caliente" (todavía no puede disparar)
- Después del período de espera, se vuelve "fría" (lista para disparar)
- Antes de disparar, comprobamos: "¿Está el arma fría?"
- Esto previene el spam de clics manteniendo controles ágiles
✅ Consulta la lección 1 de la serie de juegos espaciales para recordarte sobre los sistemas de enfriamiento.
Extenderás el código de tu juego espacial existente para crear un sistema de detección de colisiones. Como el sistema automatizado de evitación de colisiones de la Estación Espacial Internacional, tu juego monitoreará continuamente las posiciones de los objetos y responderá a las intersecciones.
Partiendo del código de tu lección anterior, añadirás detección de colisiones con reglas específicas que regulan las interacciones de los objetos.
💡 Consejo profesional: El sprite del láser ya está incluido en tu carpeta de assets y referenciado en tu código, listo para implementarse.
Mecánicas del juego para agregar:
- Láser impacta enemigo: El objeto enemigo es destruido cuando un láser lo golpea
- Láser choca con el límite de pantalla: El láser se elimina al llegar al borde superior de la pantalla
- Colisión entre enemigo y héroe: Ambos objetos se destruyen al intersectar
- Enemigo llega al fondo: Condición de juego terminado cuando los enemigos llegan al fondo de la pantalla
Fundamento de Detección de Colisiones: Antes de implementar, asegúrate de entender:
- ✅ Cómo los límites rectangulares definen zonas de colisión
- ✅ Por qué la prueba de separación es más eficiente que calcular intersecciones
- ✅ La importancia de la gestión del ciclo de vida de los objetos en bucles de juego
- ✅ Cómo sistemas orientados a eventos coordinan respuestas a colisiones
Autoevaluación Rápida: ¿Qué pasaría si eliminaras objetos inmediatamente en lugar de marcarlos? Respuesta: La eliminación a mitad de ciclo podría causar fallos o saltar objetos en la iteración
Comprensión Física: Ahora comprendes:
- Sistemas de Coordenadas: Cómo la posición y dimensiones crean límites
- Lógica de Intersección: Principios matemáticos detrás de la detección de colisiones
- Optimización de Rendimiento: Por qué los algoritmos eficientes importan en sistemas en tiempo real
- Gestión de Memoria: Patrones seguros para el ciclo de vida de objetos para estabilidad
Buenas noticias — ya hemos preparado la mayor parte para ti! Todos tus assets y la estructura básica del juego están en la subcarpeta your-work, listos para que agregues las funciones geniales de colisiones.
-| assets
-| enemyShip.png
-| player.png
-| laserRed.png
-| index.html
-| app.js
-| package.jsonEntendiendo la estructura de archivos:
- Contiene todas las imágenes sprite necesarias para los objetos del juego
- Incluye el documento HTML principal y el archivo JavaScript de la aplicación
- Proporciona configuración del paquete para el servidor de desarrollo local
Ve a la carpeta de tu proyecto y arranca el servidor local:
cd your-work
npm startEsta secuencia de comandos:
- Cambia directorio a la carpeta de tu proyecto en uso
- Inicia un servidor HTTP local en
http://localhost:5000 - Sirve tus archivos de juego para pruebas y desarrollo
- Permite desarrollo con recarga automática en vivo
Abre tu navegador y navega a http://localhost:5000 para ver el estado actual de tu juego con el héroe y enemigos renderizados en pantalla.
Como el enfoque sistemático que NASA usó para programar la nave Voyager, implementaremos la detección de colisiones metódicamente, construyendo cada componente paso a paso.
flowchart TD
A["1. Límites del Rectángulo"] --> B["2. Detección de Intersección"]
B --> C["3. Sistema Láser"]
C --> D["4. Manejo de Eventos"]
D --> E["5. Reglas de Colisión"]
E --> F["6. Sistema de Enfriamiento"]
G["Límites del Objeto"] --> A
H["Algoritmo de Física"] --> B
I["Creación de Proyectiles"] --> C
J["Entrada del Teclado"] --> D
K["Lógica del Juego"] --> E
L["Limitación de Tasa"] --> F
F --> M["🎮 Juego Completo"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
style F fill:#fce4ec
style M fill:#e1f5fe
Primero, enseñemos a los objetos del juego cómo describir sus límites. Añade este método a tu clase GameObject:
rectFromGameObject() {
return {
top: this.y,
left: this.x,
bottom: this.y + this.height,
right: this.x + this.width,
};
}Este método logra:
- Crear un objeto rectángulo con coordenadas límite precisas
- Calcular los bordes inferior y derecho usando posición más dimensiones
- Devolver un objeto listo para algoritmos de detección de colisiones
- Proveer una interfaz estandarizada para todos los objetos del juego
Ahora crearemos nuestro detective de colisiones: una función que pueda decir cuándo dos rectángulos se superponen:
function intersectRect(r1, r2) {
return !(
r2.left > r1.right ||
r2.right < r1.left ||
r2.top > r1.bottom ||
r2.bottom < r1.top
);
}Este algoritmo funciona:
- Prueba cuatro condiciones de separación entre rectángulos
- Devuelve
falsesi alguna condición de separación es verdadera - Indica colisión cuando no hay separación
- Usa lógica de negación para pruebas eficientes de intersección
¡Aquí es donde se pone emocionante! Configuraremos el sistema de disparo láser.
Primero, definamos algunos tipos de mensajes para que las distintas partes del juego puedan comunicarse:
KEY_EVENT_SPACE: "KEY_EVENT_SPACE",
COLLISION_ENEMY_LASER: "COLLISION_ENEMY_LASER",
COLLISION_ENEMY_HERO: "COLLISION_ENEMY_HERO",Estas constantes proveen:
- Estandarizan los nombres de eventos en toda la aplicación
- Habilitan comunicación consistente entre sistemas del juego
- Previenen errores ortográficos en el registro de manejadores de eventos
Agrega la detección de la tecla espacio a tu listener de eventos de teclado:
} else if(evt.keyCode === 32) {
eventEmitter.emit(Messages.KEY_EVENT_SPACE);
}Este manejador de entrada:
- Detecta presiones de la tecla espacio usando keyCode 32
- Emite un mensaje de evento estandarizado
- Permite lógica desacoplada para disparar
Registra el comportamiento de disparo en tu función initGame():
eventEmitter.on(Messages.KEY_EVENT_SPACE, () => {
if (hero.canFire()) {
hero.fire();
}
});Este listener de eventos:
- Responde a eventos de la tecla espacio
- Verifica el estado del enfriamiento para disparar
- Dispara creando un láser cuando está permitido
Agrega manejo de colisiones para interacciones láser-enemigo:
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
first.dead = true;
second.dead = true;
});Este manejador de colisiones:
- Recibe datos del evento de colisión con ambos objetos
- Marca ambos objetos para eliminación
- Asegura la limpieza adecuada tras la colisión
Implementa un proyectil láser que se mueve hacia arriba y gestiona su propio ciclo de vida:
class Laser extends GameObject {
constructor(x, y) {
super(x, y);
this.width = 9;
this.height = 33;
this.type = 'Laser';
this.img = laserImg;
let id = setInterval(() => {
if (this.y > 0) {
this.y -= 15;
} else {
this.dead = true;
clearInterval(id);
}
}, 100);
}
}Esta implementación de clase:
- Extiende GameObject para heredar funcionalidad básica
- Define dimensiones apropiadas para el sprite láser
- Crea movimiento automático hacia arriba usando
setInterval() - Se destruye a sí mismo cuando alcanza la parte superior de la pantalla
- Maneja su propia animación y limpieza
Crea una función completa para detección de colisiones:
function updateGameObjects() {
const enemies = gameObjects.filter(go => go.type === 'Enemy');
const lasers = gameObjects.filter(go => go.type === "Laser");
// Probar colisiones de láser con enemigos
lasers.forEach((laser) => {
enemies.forEach((enemy) => {
if (intersectRect(laser.rectFromGameObject(), enemy.rectFromGameObject())) {
eventEmitter.emit(Messages.COLLISION_ENEMY_LASER, {
first: laser,
second: enemy,
});
}
});
});
// Eliminar objetos destruidos
gameObjects = gameObjects.filter(go => !go.dead);
}Este sistema de colisiones:
- Filtra objetos del juego por tipo para pruebas eficientes
- Prueba cada láser contra cada enemigo en busca de intersecciones
- Emite eventos de colisión cuando detecta intersecciones
- Limpia objetos destruidos tras el procesamiento de colisiones
⚠️ Importante: AñadeupdateGameObjects()a tu ciclo principal de juego enwindow.onloadpara habilitar la detección de colisiones.
Mejora la clase Hero con mecánicas de disparo y limitación de tasa:
class Hero extends GameObject {
constructor(x, y) {
super(x, y);
this.width = 99;
this.height = 75;
this.type = "Hero";
this.speed = { x: 0, y: 0 };
this.cooldown = 0;
}
fire() {
gameObjects.push(new Laser(this.x + 45, this.y - 10));
this.cooldown = 500;
let id = setInterval(() => {
if (this.cooldown > 0) {
this.cooldown -= 100;
} else {
clearInterval(id);
}
}, 200);
}
canFire() {
return this.cooldown === 0;
}
}Comprendiendo la clase Hero mejorada:
- Inicializa el temporizador de enfriamiento en cero (listo para disparar)
- Crea objetos láser posicionados sobre la nave héroe
- Establece un período de enfriamiento para prevenir disparos rápidos
- Decrementa el temporizador usando actualizaciones periódicas
- Provee un chequeo de estado para disparar con el método
canFire()
Comprensión completa del sistema: Verifica tu dominio del sistema de colisiones:
- ✅ ¿Cómo habilitan los límites rectangulares una detección eficiente de colisiones?
- ✅ ¿Por qué es crítica la gestión del ciclo de vida para la estabilidad del juego?
- ✅ ¿Cómo previene el sistema de enfriamiento problemas de rendimiento?
- ✅ ¿Qué papel juega la arquitectura orientada a eventos en el manejo de colisiones?
Integración del sistema: Tu detección de colisiones demuestra:
- Precisión matemática: Algoritmos para intersección de rectángulos
- Optimización de desempeño: Patrones eficientes de pruebas de colisiones
- Gestión de memoria: Creación y eliminación segura de objetos
- Coordinación de eventos: Comunicación desacoplada entre sistemas
- Procesamiento en tiempo real: Ciclos de actualización por fotogramas
Patrones profesionales: Has implementado:
- Separación de responsabilidades: Física, renderizado e input separados
- Diseño orientado a objetos: Herencia y polimorfismo
- Gestión de estados: Ciclo de vida de objetos y seguimiento de estado del juego
- Optimización de rendimiento: Algoritmos eficientes para uso en tiempo real
Tu juego espacial ahora cuenta con un sistema completo de detección de colisiones y mecánicas de combate. 🚀 Prueba estas nuevas capacidades:
- Navega con las teclas de flecha para verificar controles de movimiento
- Dispara láseres con la barra espaciadora — observa cómo el enfriamiento previene disparos en ráfaga
- Observa colisiones cuando los láseres impactan enemigos, activando su eliminación
- Verifica limpieza mientras los objetos destruidos desaparecen del juego
Has implementado con éxito un sistema de detección de colisiones usando los mismos principios matemáticos que guían la navegación de naves espaciales y robótica.
- Abre las DevTools del navegador y pon puntos de interrupción en tu función de detección de colisiones
- Prueba modificando la velocidad del láser o el movimiento de los enemigos para ver efectos en colisiones
- Experimenta con diferentes valores de enfriamiento para probar las tasas de disparo
- Añadir declaraciones
console.logpara rastrear eventos de colisión en tiempo real
- Completar el cuestionario posterior a la lección y entender los algoritmos de detección de colisiones
- Agregar efectos visuales como explosiones cuando ocurren colisiones
- Implementar diferentes tipos de proyectiles con propiedades variadas
- Crear potenciadores que mejoren temporalmente las habilidades del jugador
- Añadir efectos de sonido para hacer las colisiones más satisfactorias
- Completar el juego espacial completo con sistemas de colisión pulidos
- Implementar formas de colisión avanzadas más allá de rectángulos (círculos, polígonos)
- Agregar sistemas de partículas para efectos realistas de explosión
- Crear comportamientos complejos de enemigos con evitación de colisiones
- Optimizar la detección de colisiones para mejor rendimiento con muchos objetos
- Añadir simulación física como momentum y movimiento realista
- Construir juegos con motores físicos avanzados y simulaciones realistas
- Aprender detección de colisiones 3D y algoritmos de partición espacial
- Contribuir a librerías de física y motores de juegos de código abierto
- Dominar la optimización de rendimiento para aplicaciones gráficamente intensivas
- Crear contenido educativo sobre física de juegos y detección de colisiones
- Construir un portafolio que demuestre habilidades avanzadas en programación física
timeline
title Progresión de Aprendizaje de Detección de Colisiones y Física de Juegos
section Fundamentos (10 minutos)
Matemáticas Rectangulares: Sistemas de coordenadas
: Cálculos de límites
: Seguimiento de posición
: Gestión de dimensiones
section Diseño de Algoritmos (20 minutos)
Lógica de Intersección: Pruebas de separación
: Detección de superposición
: Optimización de rendimiento
: Manejo de casos límite
section Implementación de Juegos (30 minutos)
Sistemas de Objetos: Gestión del ciclo de vida
: Coordinación de eventos
: Seguimiento del estado
: Limpieza de memoria
section Características Interactivas (40 minutos)
Mecánicas de Combate: Sistemas de proyectiles
: Enfriamientos de armas
: Cálculo de daño
: Retroalimentación visual
section Física Avanzada (50 minutos)
Sistemas en Tiempo Real: Optimización de tasa de cuadros
: Particionamiento espacial
: Respuesta a colisiones
: Simulación física
section Técnicas Profesionales (1 semana)
Conceptos de Motores de Juegos: Sistemas de componentes
: Pipelines de física
: Perfiles de rendimiento
: Optimización multiplataforma
section Aplicaciones Industriales (1 mes)
Habilidades de Producción: Optimización a gran escala
: Colaboración en equipo
: Desarrollo de motores
: Despliegue en plataformas
Después de completar esta lección, ahora dominas:
- Matemáticas de colisión: Algoritmos de intersección de rectángulos y sistemas de coordenadas
- Optimización de rendimiento: Detección de colisiones eficiente para aplicaciones en tiempo real
- Gestión del ciclo de vida del objeto: Patrones seguros de creación, actualización y destrucción
- Arquitectura basada en eventos: Sistemas desacoplados para respuesta a colisiones
- Integración con el bucle del juego: Actualizaciones físicas basadas en frames y coordinación con el renderizado
- Sistemas de entrada: Controles responsivos con limitación de tasa y retroalimentación
- Gestión de memoria: Estrategias eficientes de agrupación de objetos y limpieza
Aplicaciones en el mundo real: Tus habilidades en detección de colisiones aplican directamente a:
- Simulaciones interactivas: Modelado científico y herramientas educativas
- Diseño de interfaces de usuario: Interacciones drag-and-drop y detección táctil
- Visualización de datos: Gráficos interactivos y elementos clicables
- Desarrollo móvil: Reconocimiento de gestos táctiles y manejo de colisiones
- Programación robótica: Planificación de ruta y evitación de obstáculos
- Gráficos por computadora: Trazado de rayos y algoritmos espaciales
Habilidades profesionales adquiridas: Ahora puedes:
- Diseñar algoritmos eficientes para detección de colisiones en tiempo real
- Implementar sistemas físicos que escalen con la complejidad de los objetos
- Depurar sistemas de interacción complejos usando principios matemáticos
- Optimizar rendimiento para diferentes capacidades de hardware y navegadores
- Arquitectar sistemas de juego mantenibles usando patrones de diseño probados
Conceptos de desarrollo de juegos dominados:
- Simulación física: Detección y respuesta de colisiones en tiempo real
- Ingeniería de rendimiento: Algoritmos optimizados para aplicaciones interactivas
- Sistemas de eventos: Comunicación desacoplada entre componentes del juego
- Gestión de objetos: Patrones eficientes de ciclo de vida para contenido dinámico
- Manejo de entrada: Controles responsivos con retroalimentación apropiada
Siguiente nivel: ¡Estás listo para explorar motores físicos avanzados como Matter.js, implementar detección de colisiones 3D o construir sistemas complejos de partículas!
🌟 Logro desbloqueado: ¡Has construido un sistema completo de interacción basado en física con detección profesional de colisiones!
Usa el modo Agente para completar el siguiente reto:
Descripción: Mejora el sistema de detección de colisiones implementando potenciadores que aparecen aleatoriamente y proporcionan habilidades temporales cuando los recoge la nave héroe.
Instrucción: Crea una clase PowerUp que extienda GameObject e implementa la detección de colisiones entre el héroe y los potenciadores. Añade al menos dos tipos de potenciadores: uno que incrementa la velocidad de disparo (reduce el cooldown) y otro que crea un escudo temporal. Incluye lógica de aparición que cree potenciadores en intervalos y posiciones aleatorias.
¡Agrega una explosión! Echa un vistazo a los recursos del juego en el repositorio de arte espacial y trata de agregar una explosión cuando el láser golpea a un alienígena
Cuestionario posterior a la clase
Experimenta con los intervalos en tu juego hasta ahora. ¿Qué sucede cuando los cambias? Lee más sobre eventos temporales en JavaScript.
Aviso legal: Este documento ha sido traducido utilizando el servicio de traducción automática Co-op Translator. Aunque nos esforzamos por lograr precisión, tenga en cuenta que las traducciones automáticas pueden contener errores o inexactitudes. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables por malentendidos o interpretaciones erróneas derivadas del uso de esta traducción.