将僵尸旋转到面对玩家

时间:2019-05-09 14:32:20

标签: java trigonometry degrees

我正试图使一群僵尸面对一个玩家。一段时间以来,我一直试图自己弄清楚,但似乎无法弄清楚。

我当前正在使用以下代码旋转僵尸:

public void calculateAngle() {
        double theta = 0.0d;
        for(Zombie zombie : entities) {
            double a = zombie.getX() - player.getX(); 
            double b = zombie.getY() - player.getY();
            double c = (int) Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));

            if(zombie.getX() > player.getX() && zombie.getY() > player.getY())
                theta = Math.sin(b / c) + 90;
            else if(zombie.getX() < player.getX() && zombie.getY() > player.getY())
                theta = Math.sin(b / a) - 60;
            else if(zombie.getX() > player.getX() && zombie.getY() < player.getY())
                theta = Math.sin(a / c);
            else
                theta = Math.sin(a / c);
            zombie.setDegrees(theta);
        }
    }

我尝试使用人们建议的atan2函数,但对我没有用。我知道僵尸的位置和玩家的位置。我将如何去做?

编辑:我阅读了注释以及当实施到我的代码中时Thomas所说的内容。更新的代码可以在下面找到:

public void calculateAngle() {
        float theta = 0.0f;
        for(Zombie zombie : entities) {
            float a = zombie.getX() - player.getX() - 40; 
            float b = zombie.getMidpointY() - 10 - player.getY() - 10;

            theta = (float) Math.toDegrees(Math.atan2(b, a)) + 90;
            zombie.setDegrees(theta);
        }
    }

值的更改(例如-40和-10)用于调整x和y位置,使僵尸正确面对玩家。为了旋转图像本身,我将AffineTransform与.rotate(theta,x,y)方法一起使用。我不完全知道为什么使用Math.atan2()方法最初不适用于我的代码,但是现在可以使用。谢谢您的帮助。

1 个答案:

答案 0 :(得分:2)

sin函数希望将度数作为输入,并且其结果始终在[-1..1]内,您无法使用它来计算度数。