Xbox-джойстик используется для вращения спрайта, базовая формула заставляет его «прилипать» или чувствовать себя «липким» с интервалами в 90 градусов! Как вы получаете плавное вращение?

9

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

В моем основном методе обновления:

shuttleAngle = (float) Math.Atan2(newGamePadState.ThumbSticks.Right.X, newGamePadState.ThumbSticks.Right.Y);

В моем основном методе розыгрыша:

spriteBatch.Draw(shuttle, shuttleCoords, sourceRectangle, Color.White, shuttleAngle, origin, 1.0f, SpriteEffects.None, 1);

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

По какой-то причине, когда я поворачиваю спринт, он чувствует себя липким под углами 0, 90, 180 и 270 градусов. Он хочет обосноваться под этими углами. Это не дает мне плавного и естественного вращения, как я чувствовал бы в игре, которая использует подобную механику. PS: мой контроллер Xbox в порядке!

Хью
источник
1
Разве Atan2 не принимает сначала значение Y, а затем значение X? msdn.microsoft.com/en-us/library/system.math.atan2.aspx . Вы должны поменять местами значения x и y. Также вы рассматривали ослабление ваших значений путем интерполяции? toValue-currentValue / speed
Сидар
Извините, я имел в виду newShuttleAngle - oldShuttleAngle / speed.
Сидар
Это повлияет только на визуальную ориентацию, и это полностью зависит от того, каким образом будет ориентировано изображение для текстуры - я не вижу, чтобы это повлияло на его проблему.
Джо Шанахан
Это винда? Если это так, настройте проект на использование окна консоли («Проект» -> «Параметры проекта» -> «Приложение» -> «Тип вывода») и распечатайте свой угол, shuttleAngleчтобы увидеть, придерживается ли он этих углов
Джо Шанахан
2
вау отличная работа SomeWritesReserved и все остальные, я действительно впечатлен этим сайтом, отзывы очень быстрые! Это мой первый пост, так что, может, кто-нибудь подскажет, что мне нужно сделать, чтобы правильно отдать должное всем тем, кто помог?
Хью

Ответы:

18

Это может быть из-за того, как работает мертвая зона GamePad. По умолчанию GamePadDeadZone.IndependentAxesэто означает, что каждая ось проверяется по мертвой зоне в отдельности. Это приводит к привязке входа к каждой оси аналогового джойстика. Вместо этого попробуйте использовать GamePadDeadZone.Circular:

newGamePadState = GamePad.GetState(playerIndex, GamePadDeadZone.Circular);

Это должно дать вам гораздо более плавное управление на обеих осях. Посетите страницу MSDN и эту статью Шона Харгривза .

SomeWritesReserved
источник