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; };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 o1Entonces, 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.