java - 旋转僵尸面对玩家

标签 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 函数,但它对我不起作用。我知道僵尸的位置和玩家的位置。我该如何去做呢?

编辑:我阅读了评论,并且托马斯所说的内容在我的代码中实现时有效。更新后的代码如下:

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() 方法最初不适用于我的代码,但现在可以使用。感谢您的所有帮助。

最佳答案

sin 函数需要度数作为输入,其结果始终在 [-1..1] 范围内,您无法使用它计算度数。

关于java - 旋转僵尸面对玩家,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56061764/

相关文章:

c++ - 这段代码是如何工作的?俯仰和偏航

javascript - 度数转换不适用于反三 Angular 函数

java - 我如何告诉 java 它更接近 350 -> 355 -> 360 -> 05 度而不是一直绕

java - 需要在 spring mongotemplate 中复制查询

java - ResourceLeakDetector.setLevel(PARANOID) 不生成资源泄漏日志

高级三角函数的 C 库?

java - 如何在 java 中的 ThreePoint 三角形程序中实现这些角度?

python - 如何用纯 Python 编写这些方程?

java - 静态通用接口(interface)实现

java - 在 Java 中逐字地在多个字符之后包装字符串