No se puede detectar la colisión con Polígono.
Estoy tratando de detectar una colisión entre un círculo y un objeto de tipo Polígono, por lo que estoy utilizando Polygon.contains() con las coordenadas del círculo.
Pero por alguna razón desconocida, solo a veces detecta una colisión:
cuando aparece el primer meteorito (polígono), intento dispararle (la bala es el círculo) y puede que lo detecte pero no siempre, lo mismo ocurre con el segundo y así sucesivamente, es decir, la detección no siempre funciona.
El código:
public void run() {
super.run();
while (true){
decreaseArr(this.shapes[0].xpoints,1);
if (!Bullet.bulletList.isEmpty()){
for (int i = 0; i< Bullet.bulletList.size() ; i++){
Bullet currentBullet= Bullet.bulletList.get(i);
if (this.shapes[0].contains(currentBullet.x, currentBullet.y)){
System.out.println(meteorList.indexOf(this));
System.out.println("¡HIT!");
Bullet.bulletList.remove(currentBullet); //Eliminar bala de la pantalla
meteorList.remove(this); //Eliminar del pantalla
breakFlag=true;
System.out.println(Meteor.meteorList);
}
}
if (breakFlag)
break;
}
try {
TimeUnit.MILLISECONDS.sleep(meteorVelocity);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
(Ese es el método run dentro de la clase Meteor, por lo que cada meteorito tiene un arreglo de formas (y por ahora solo tiene una forma, pero más adelante agregaré más))
EDICIÓN:
Algunas imágenes en video:
https://vimeo.com/659040692 (perdón por no editar antes, acabé de llegar a casa :))
EDICIÓN 2:
Nota importante:
Cada vez que ejecuto el juego, es posible que no pueda destruir los mismos meteoritos que la vez anterior: cada vez obtengo resultados diferentes.
davy.ai
Solución para la detección de colisiones en el juego Asteroids
Si la detección de colisiones no funciona correctamente, puede haber algunos problemas con la implementación. Una posible razón podría ser que las coordenadas del círculo y del polígono no coinciden adecuadamente. Aquí hay algunas sugerencias que pueden ayudar a mejorar la precisión de la detección de colisiones:
Utilice el método
Polygon.intersects()
en lugar dePolygon.contains()
. El métodointersects()
verifica si un segmento de línea se intersecta con el polígono. Aquí, podemos utilizar el diámetro del círculo como el segmento de línea. Este enfoque funciona bien cuando el polígono tiene más vértices.Intente reducir el tamaño del polígono o aumentar el tamaño del círculo. Esto puede ayudar a minimizar la posibilidad de tener huecos entre el círculo y el polígono.
Verifique si las coordenadas del círculo y del polígono están en el mismo sistema de coordenadas. Si las coordenadas están en sistemas diferentes, puede dar como resultado una detección de colisiones inexacta.
Al utilizar estos enfoques, puede mejorar la precisión de la detección de colisiones en su juego Asteroids.