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 - старийShuttleAngle / speed.
Сидар

Це вплине лише на візуальну орієнтацію, і це повністю залежить від того, на який спосіб орієнтується зображення для текстури - я не бачу, що вплинуло на його проблему.
Джо Шанахан

Це Windows? Якщо так, встановіть проект, скористайтеся консольним вікном (Проект -> Параметри проекту -> Застосування -> Тип виводу) та роздрукуйте свій кут, shuttleAngleщоб побачити, чи стикається це під тими кутами
Джо Шанахан

2
вау чудова робота SomeWritesReserved і всі інші, я дуже вражений цим сайтом, зворотній зв'язок так швидко! це моє перше повідомлення, щоб хто-небудь, будь-ласка, скажи мені, що мені потрібно зробити, щоб належним чином зарахувати всіх тих, хто допоміг?
Х'ю

Відповіді:


18

Це може бути через те, як працює дедзоп GamePad. Це значення за замовчуванням GamePadDeadZone.IndependentAxes, що означає, що кожна вісь перевіряється по відношенню до мертвої зони окремо. Це, як правило, призводить до того, що вхід підключиться до кожної осі аналогового мініатюрного. Натомість спробуйте використовувати GamePadDeadZone.Circular:

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

Це має дати вам більш плавний контроль на обох осях. Перегляньте сторінку MSDN та цю статтю Shawn Hargreaves .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.