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.

Las balas se vuelven súper rápidas a medida que el ángulo se acerca a 90.

Entonces estoy desarrollando un juego en Java y estoy intentando disparar balas hacia la posición del cursor. La parte del disparo está bien, pero a medida que el ángulo entre el cursor y el jugador (el jugador dispara las balas, por lo que esencialmente son las primeras coordenadas de la bala) se acerca a 90 (o -90), las balas van súper rápido y no tengo idea de por qué.

La zona roja es la zona de súper velocidad.

Código:

    public void run() {
        super.run();
        final double currentY=y;
        final double currentX=x;

<pre><code>    double slope = (cursorPos.y - currentY) / (cursorPos.x - currentX);
    double angle= Math.toDegrees(Math.atan2(cursorPos.y - currentY, cursorPos.x - currentX));
    System.out.println(angle);
    while (true){
        try {
            double newY;// y = m * (x-x.) + y.
            newY = ((slope*(x - currentX))+currentY);
            y= (int) newY;
            if ((angle <=-90 && angle>=-180) || (angle >=90 && angle<=180) )
            {
                x--;
            }
            else {
                x++;
            }
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
</code></pre>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría ser con el cálculo del ángulo y la pendiente. A medida que el ángulo se acerca a 90 o -90 grados, la pendiente se acerca a infinito o infinito negativo, respectivamente. Esto puede hacer que la velocidad de las balas aumente drásticamente, lo que resulta en la “zona de súper velocidad” que se muestra en la imagen.

    Para solucionar esto, podría verificar estos casos extremos y manejarlos por separado. Por ejemplo, si la pendiente es infinito, la bala podría simplemente moverse directamente hacia arriba o hacia abajo en lugar de en un ángulo. De manera similar, si la pendiente es infinito negativo, la bala podría moverse directamente hacia abajo o hacia arriba.

    Aquí hay una versión actualizada del código con estas verificaciones en su sitio:

    public void run() {
        super.run();
        final double currentY=y;
        final double currentX=x;
    
        double slope = (cursorPos.x - currentX) != 0 ? (cursorPos.y - currentY) / (cursorPos.x - currentX) : Double.POSITIVE_INFINITY;
        double angle= Math.toDegrees(Math.atan2(cursorPos.y - currentY, cursorPos.x - currentX));
        System.out.println(angle);
        while (true){
            try {
                double newY;// y = m * (x-x.) + y.
                if (Double.isInfinite(slope)) {
                    // La pendiente es infinito, muévete directamente hacia arriba o hacia abajo
                    newY = slope == Double.POSITIVE_INFINITY ? currentY - 1 : currentY + 1;
                } else {
                    newY = ((pendiente*(x - currentX))+currentY);
                }
                y= (int) newY;
                if ((angle <= -90 && angle >= -180) || (angle >= 90 && angle <= 180) ) {
                    // Caso extremo cuando el ángulo está cerca de 90 o -90 grados
                    x--;
                } else {
                    x++;
                }
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

    Tenga en cuenta que también he agregado una verificación para cuando la pendiente es indefinida (es decir, el cursor está directamente encima o debajo del jugador). En este caso, la pendiente se establece en Double.POSITIVE_INFINITY y la bala se mueve directamente hacia arriba o hacia abajo.

Comments are closed.