Вращающиеся зомби в лицо игроку - PullRequest
2 голосов
/ 09 мая 2019

Я пытаюсь повернуть орду зомби, чтобы встретиться с игроком. Я пытался понять это сам в течение некоторого времени, но я не могу понять это.

В настоящее время я использую следующий код для поворота зомби:

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 () изначально не работало с моим кодом, но теперь работает. Спасибо за помощь.

1 Ответ

2 голосов
/ 09 мая 2019

sin функция ожидает в качестве входных данных градусы, и ее результат всегда находится в пределах [-1..1], вы не можете рассчитать градусы, используя ее.

...