Как повернуть объект, чтобы он всегда был перед мышью? - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь создать игру, и мне нужно, чтобы игрок (прямоугольник) всегда смотрел на мышь, я нашел несколько страниц по этому вопросу, но, похоже, не понимаю математику. Main:

 g2d.rotate(calculateRotation, x,y);
 g2d.fill(player);
 g2d.rotate(-calculateRotation, x,y);

Слушатель мыши:

 int mx = e.getX();
 int mY = e.getY();

float rotation = Math.atan((mouseX-playerX)/(mouseY-playerY)); //<--- I don't know

было бы что-то вроде этого?

1 Ответ

0 голосов
/ 14 мая 2018

Вы должны использовать линейную алгебру - вместо использования синусов и косинусов, вы используете векторы.

Если у вас есть P1 = (x1, y1) (где игрок) и P2 = (x2, y2) (где указатель мыши), тогда у вас есть вектор V = (x2-x1, y2-y1) = (v1, v2), которыйимеет длину v = | V | = sqrt (v1 ^ 2 + v2 ^ 2).Тогда у вас есть версор (который является вектором длины = 1) M = (v1 / v, v2 / v) = (m1, m2).

Тогда вместо вычисления угла вы можете вращать точкипутем отображения (x, y) -> (x * m1-y * m2, x * m2 + y * m1).

См. также https://en.wikipedia.org/wiki/Rotation_matrix#In_two_dimensions

(и не забудьте позаботитьсяв случае V = 0)

Примечание: использование atan - это нормально, но вам нужно будет проверить знаки x и y .. Если они оба отрицательны, вы найдете неправильный угол;и если один положительный, а другой отрицательный, вы все равно не знаете, указывает ли ваша стрелка на северо-запад или юго-восток.

...