Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

148
Vistas
¿Por qué no funciona el rebote de actores en mi juego de navegador JavaScript?

Quiero implementar un cohete que vuele por el espacio, que rebote en los meteroides entrantes. Actualmente lo he implementado comparando la posición x e y de ambos actores e intercambiando sus velocidades en caso de colisión. La detección de una colisión y el cambio de velocidad funcionan (probado por console.log), sin embargo, en la pantalla solo rebotan a veces.

Traté de asegurarme de que los objetos de velocidad de los actores comparados no hicieran referencia al mismo objeto de JavaScript (con cSpeedX etc.).

El juego está construido con Pixi JS.

La función de detección de colisión, ejecutada para cada actor (todos los meteroides y el cohete)

 export const checkCollision = (current, objects) => { objects.forEach((o) => { if (current !== o) { const dx = current.x < ox ? ox - o.width / 2 - (current.x + current.width / 2) : current.x - current.width / 2 - (ox + o.width / 2); const dy = current.y < oy ? oy - o.height / 2 - (current.y + current.height / 2) : current.y - current.height / 2 - (oy + o.height / 2); if (dx < 0 && dy < 0) { const cSpeedX = current.speed.x; const cSpeedY = current.speed.y; const oSpeedX = o.speed.x; const oSpeedY = o.speed.y; current.speed.x = oSpeedX; current.speed.y = oSpeedY; o.speed.x = cSpeedX; o.speed.y = cSpeedY; } } });

La función de movimiento implementada tanto en el cohete como en los meteroides.

 this.move = (delta) => { this.x += this.speed.x * delta; this.y += this.speed.y * delta; };
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

export const checkCollision = (current, objects) => { objects.forEach((o) => { if (current !== o) {

También escribiste: The collision detection function, executed for each actor (all meteroids and the rocket)

así que supongo que en algún lugar también hay un bucle como:

 objects.forEach((o) => { checkCollision(o, objects); });

Esto significaría que para cada par de objetos, la colisión se verifica dos veces.

Supongamos que o1 y o2 son objetos diferentes y que chocan. ¿Qué pasará entonces? :

 checkCollision(o1, objects); <-- swap speed between o1 and o2 ... checkCollision(o2, objects); <-- swap speed between o2 and o1

Entonces, la velocidad se intercambiará 2 veces entre ellos, en otras palabras: la velocidad de ambos objetos seguirá siendo la misma.

Para investigar si este es realmente el caso, puede poner console.log (o algo para imprimir la identificación del objeto) así:

 if (dx < 0 && dy < 0) { console.log('swapping speed of of objects:'); console.log(current); console.log(o); const cSpeedX = current.speed.x;

Luego, prepare la situación cuando 2 objetos colisionen y verifique los registros de la consola.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda