es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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:

    1. Utilice una fórmula sencilla para calcular la distancia entre el centro del círculo y cada vértice del polígono. Si la distancia es menor o igual al radio del círculo, entonces hay una colisión. Este enfoque funciona bien cuando el polígono tiene pocos vértices.
    2. Utilice el método Polygon.intersects() en lugar de Polygon.contains(). El método intersects() 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.

    public boolean collidesWith(Polygon polygon, int x, int y, int radius) {
        // Calcular los vértices del polígono
        int[] xpoints = polygon.xpoints;
        int[] ypoints = polygon.ypoints;
        Point[] vertices = new Point[polygon.npoints];
        for (int i = 0; i < polygon.npoints; i++) {
            vertices[i] = new Point(xpoints[i], ypoints[i]);
        }
        // Calcular el centro del círculo
        Point center = new Point(x, y);
        // Verificar colisión
        for (int i = 0; i < vertices.length; i++) {
            int j = (i + 1) % vertices.length;
            Line2D line = new Line2D.Double(vertices[i].x, vertices[i].y, vertices[j].x, vertices[j].y);
            double distance = line.ptSegDist(center);
            if (distance <= radius) {
                return true;
            }
        }
        return false;
    }
    
    1. 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.

    2. 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.

Comments are closed.