XNA Вращение спрайта для точного наведения курсора - PullRequest
4 голосов
/ 07 сентября 2011

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

вот код, который я использую:

чтобы получить угол:

direction = mousePos - position;
rotation = (float)Math.Atan2(direction.Y, direction.X);

Рисовать спрайт:

spriteBatch.Begin();
spriteBatch.Draw(sprite, position, null, Color.White, rotation + 90, origin, 1.0f, SpriteEffects.None, 0);
spriteBatch.End();

поэтому, если это мой спрайт: [] верхний левый угол будет указывать на курсор, а не на середину: P

Ответы [ 5 ]

4 голосов
/ 08 сентября 2011

не добавляйте 90. что бы вы ни делали. функция Atan2 будет возвращать угол в радианах (намного лучше, чем градусы, как только вы начнете их использовать). так что добавление 90 сразу скинет.

Если вы хотите изменить поворот изображения на 90 градусов, вам нужно добавить половину значения PI (360 градусов = 2xPI).

так что об этом нужно позаботиться.

spriteBatch.Draw(sprite, position, null, Color.White, rotation + (Math.PI*0.5f), origin, 1.0f, SpriteEffects.None, 0);
1 голос
/ 15 июня 2012

Я не уверен, что добавление 90 вредит конечному результату или нет, как сказал человек над мной, но причина, по которой угол спрайтов обращен к вашей мыши, заключается в том, что в XNA он использует верхнюю левую точку спрайтакак происхождение.установите его в центр спрайта и проблема решена.

Выглядит примерно так:

spriteBatch.Draw(sprite, position, null, Color.White, rotation + 90,new Vector2(sprite.Width /2, sprite.Height /2) , 1.0f, SpriteEffects.None, 0);

Это установит относительную середину текстуры спрайта.

0 голосов
/ 02 июня 2018

Привет в xna, у них нет степеней, у них есть кое-что еще, имя которого я не знаю, и это означает, что пи i 180 градусов, и чтобы получить 90 градусов, вы просто берете 3,14 / 2 = 1,57

так: вращение + 1,57

0 голосов
/ 11 января 2018

Если вам все еще нужен ответ через 7 лет xD Вам нужно установить WindowHandle.

Mouse должен по умолчанию сообщать о своей позиции относительно игры окно, но можно настроить, назначив соответствующее окно ручка к Mouse.WindowHandle.

Документация здесь . Я думаю этот также является ответом.

0 голосов
/ 07 сентября 2011
direction.x = mousePos.x - (position.x + spriteWidth / 2);
direction.y = mousePos.y - (position.y + spriteHeight / 2);

Это выглядит некрасиво, но избегайте создания нового вектора2, что будет способствовать экономии некоторых кадров в секунду:)

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