Der Xbox-Daumenstiel dient zum Drehen des Sprites. Die Grundformel lässt es in 90-Grad-Intervallen „kleben“ oder sich „klebrig“ anfühlen! Wie kommt man zu einer gleichmäßigen Rotation?

9

Ich verwende eine sehr einfache Formel, um anhand des Daumensticks des Xbox-Controllers zu berechnen, in welchen Winkel mein Sprite (z. B. Raumschiff) zeigen soll, dh Sie verwenden den Daumenstift, um das Schiff zu drehen.

In meiner Hauptaktualisierungsmethode:

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

In meiner Hauptzeichnungsmethode:

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

Wie Sie sehen, ist es ganz einfach. Ich nehme das aktuelle Bogenmaß vom Daumenstiel, speichere es in einem Schwimmer shuttleAngleund verwende es dann als Drehwinkelargument (im Bogenmaß) zum Zeichnen des Shuttles.

Wenn ich den Sprint drehe, fühlt er sich aus irgendeinem Grund bei Winkeln von 0, 90, 180 und 270 Grad klebrig an. Es will sich in diesen Winkeln niederlassen. Es gibt mir keine sanfte und natürliche Rotation, wie ich sie in einem Spiel mit einer ähnlichen Mechanik fühlen würde. PS: Mein Xbox-Controller ist in Ordnung!

Hugh
quelle
1
Nimmt Atan2 nicht zuerst den Y-Wert und dann den X-Wert? msdn.microsoft.com/en-us/library/system.math.atan2.aspx . Sie müssen zuerst Ihren x- und y-Wert tauschen. Haben Sie auch darüber nachgedacht, Ihre Werte durch Interpolation zu lockern? toValue-currentValue / speed
Sidar
Entschuldigung, ich meinte newShuttleAngle - oldShuttleAngle / speed.
Sidar
Das würde nur die visuelle Ausrichtung beeinflussen und das hängt ganz davon ab, wie das Bild für die Textur ausgerichtet ist - ich kann nicht sehen, dass dies sein Problem beeinflusst.
Joe Shanahan
Ist das Windows? Wenn ja, stellen Sie das Projekt so ein, dass es ein Konsolenfenster verwendet (Projekt -> Projektoptionen -> Anwendung -> Ausgabetyp) und drucken Sie Ihren Winkel aus, um shuttleAnglezu sehen, ob dieser in diesen Winkeln bleibt
Joe Shanahan,
2
wow tolle Arbeit SomeWritesReserved und alle anderen, ich bin wirklich beeindruckt von dieser Seite, das Feedback ist so schnell! Es ist mein erster Beitrag. Kann mir bitte jemand sagen, was ich tun muss, um alle, die geholfen haben, richtig zu würdigen?
Hugh

Antworten:

18

Dies könnte daran liegen, wie die Totzone des GamePad funktioniert. Der Standardwert ist GamePadDeadZone.IndependentAxes, dass jede Achse einzeln gegen die Totzone geprüft wird. Dies führt dazu, dass der Eingang an jeder Achse des analogen Daumensticks einrastet. Versuchen Sie stattdessen Folgendes GamePadDeadZone.Circular:

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

Dies sollte Ihnen eine viel reibungslosere Kontrolle auf beiden Achsen geben. Schauen Sie sich die MSDN-Seite und diesen Artikel von Shawn Hargreaves an .

SomeWritesReserved
quelle