Повернуть изображение в MousePos? - PullRequest
2 голосов
/ 14 мая 2011

Я хочу повернуть изображение в java, инициализированное

            playerimage = Toolkit.getDefaultToolkit().getImage("C:/Game/player.png"); //Load Player Image

нарисовано с:

        Graphics2D g = buffer.createGraphics();
    g.drawImage(playerimage, player.getX(), player.getY(), null); // Draw Player

Теперь я хочу, чтобы мое изображение игрока поворачивалось к моей мышке, поэтому оно в основном смотрит на мою мышь. Как бы я это сделал?

1 Ответ

1 голос
/ 14 мая 2011

Первое, что вам нужно сделать, это получить мышью pos и позицию игрока в одной и той же системе координат. Когда вы получаете нашу мышку, она обычно находится в экранных координатах, в то время как ваш игрок может находиться в вашем собственном пространстве «Мировые координаты». Если позиция игроков привязана непосредственно к пикселям, то вы можете пропустить.

Преобразовать положение мыши в мировые координаты.

mouseWorld.X = (mouseScreen.X / screenWidth) * worldWidth;

Когда вы находитесь в той же системе координат, вам нужно найти угол, необходимый для поворота. Это уравнение будет меняться в зависимости от того, в какую сторону направлен рисунок вашего игрока, предположим, что он направлен вверх по оси X. Тогда вы можете просто использовать точечное произведение, чтобы найти угол между тем, куда смотрит ваш игрок и точкой, на которую указывает точка.

The dot product is A(dot)B = mag(A) * mag(B) * cos (theta) 
mag = magnitude of the vector
theta = angle between the two vectors
So if you normalize the vectors (make them length 1) then..
A(dot)B = 1 * 1 * cos(theta)
A(dot)B = cos(theta)
acos(A(dot)B) = theta

Итак, давайте сделаем код ...

Vector mouseVec(mouseWorld.X, mouseWorld.Y);
Vector playerVec(playerWorld.X, playerWorld.Y);

//You want to find the angle the player must turn, so pretend the player pos it the origin
mouseVec -= playerVec;

//Create a vector that represents which way your player art is facing
Vector facingVec(1, 0);

mouseVec.Normalize();  //Make their length 1
facingVec.Normalize();

double dotProd = mouseVec.dot(facing);
double angBetween = acos(dotProd);

затем вызовите 'rotate' и передайте angBetween!

Дважды проверьте правильность единиц измерения, часто acos возвращает «радианы», а функция поворота принимает «градусы», поэтому вам нужно конвертировать.

Больше векторной информации: Векторная информация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...