La manette Xbox utilisée pour faire tourner le sprite, la formule de base le rend «collant» ou se sent «collant» à des intervalles de 90 degrés! Comment obtenez-vous une rotation en douceur?

9

J'utilise une formule très basique pour calculer l'angle de mon sprite (vaisseau spatial par exemple) en fonction de la manette de la manette Xbox, c'est-à-dire que vous utilisez la manette pour faire pivoter le vaisseau.

Dans ma principale méthode de mise à jour:

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

Dans ma méthode de tirage principal:

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

Comme vous pouvez le voir, c'est assez simple, je prends les radians actuels de la manette et les stocke dans un flotteur shuttleAngle, puis je les utilise comme argument d'angle de rotation (en radians) pour dessiner la navette.

Pour une raison quelconque, lorsque je tourne le sprint, il semble collant à des angles de 0, 90, 180 et 270 degrés. Il veut s'installer à ces angles. Cela ne me donne pas une rotation douce et naturelle comme je le ferais dans un jeu qui utilise un mécanisme similaire. PS: Ma manette Xbox va bien!

Hugh
la source
1
Atan2 ne prend-il pas d'abord la valeur Y puis la valeur X? msdn.microsoft.com/en-us/library/system.math.atan2.aspx . Vous devez d'abord échanger vos valeurs x et y. Avez-vous également envisagé d'assouplir vos valeurs par interpolation? toValue-currentValue / speed
Sidar
Désolé, je voulais dire newShuttleAngle - oldShuttleAngle / speed.
Sidar
Cela n'affecterait que l'orientation visuelle et cela dépend entièrement de la façon dont l'image de la texture est orientée - je ne vois pas que cela affecte son problème.
Joe Shanahan
Est-ce Windows? Si c'est le cas, configurez le projet pour utiliser une fenêtre de console (Projet -> Options du projet -> Application -> Type de sortie) et imprimez votre angle shuttleAnglepour voir si cela colle à ces angles
Joe Shanahan
2
wow excellent travail SomeWritesReserved et tout le monde, je suis vraiment impressionné par ce site, les commentaires sont si rapides! C'est mon premier message, alors quelqu'un peut-il me dire ce que je dois faire pour créditer correctement tous ceux qui ont aidé?
Hugh

Réponses:

18

Cela pourrait être dû au fonctionnement de la zone morte du GamePad. La valeur par défaut est GamePadDeadZone.IndependentAxes, ce qui signifie que chaque axe est vérifié individuellement par rapport à la zone morte. Cela a tendance à faire en sorte que l'entrée s'aligne sur chaque axe de la manette analogique. Essayez plutôt d'utiliser GamePadDeadZone.Circular:

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

Cela devrait vous donner un contrôle beaucoup plus fluide sur les deux axes. Consultez la page MSDN et cet article de Shawn Hargreaves .

SomeWritesReserved
la source