La levetta Xbox utilizzata per ruotare lo sprite, la formula di base lo fa "attaccare" o "appiccicoso" a intervalli di 90 gradi! Come si ottiene una rotazione regolare?


9

Sto usando una formula molto semplice per calcolare l'angolazione che la mia sprite (ad esempio un'astronave) dovrebbe essere orientata in base alla levetta del controller Xbox, ovvero usare la levetta per ruotare la nave.

Nel mio metodo di aggiornamento principale:

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

Nel mio metodo di disegno principale:

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

Come puoi vedere è abbastanza semplice, prendo i radianti correnti dalla levetta e li memorizzo in un float shuttleAnglee quindi li utilizzo come argomento dell'angolo di rotazione (in radianti) per disegnare la navetta.

Per qualche ragione quando ruoto lo sprint mi sembra appiccicoso ad angoli di 0, 90, 180 e 270 gradi. Vuole stabilirsi in quegli angoli. Non mi sta dando una rotazione regolare e naturale come mi sentirei in un gioco che usa una meccanica simile. PS: il mio controller Xbox va bene!


1
Atan2 non prende prima il valore Y e poi il valore X? msdn.microsoft.com/en-us/library/system.math.atan2.aspx . Devi prima scambiare il tuo valore xey. Hai anche considerato di facilitare i tuoi valori per interpolazione? toValue-currentValue / speed
Sidar,

Scusa, volevo dire newShuttleAngle - oldShuttleAngle / speed.
Sidar,

Ciò influirebbe solo sull'orientamento visivo e dipende interamente dal modo in cui è orientata l'immagine per la trama: non riesco a vedere che ha influenzato il suo problema.
Joe Shanahan,

Questo è Windows? In tal caso, imposta il progetto in modo che utilizzi una finestra della console (Progetto -> Opzioni progetto -> Applicazione -> Tipo di output) e stampa il tuo angolo shuttleAngleper vedere se si attacca a quegli angoli
Joe Shanahan,

2
wow ottimo lavoro SomeWritesReserved e tutti gli altri, sono davvero impressionato da questo sito, il feedback è così veloce! è il mio primo post, quindi qualcuno può dirmi cosa devo fare per dare credito a tutti coloro che mi hanno aiutato?
Hugh,

Risposte:


18

Potrebbe essere a causa di come funziona la zona morta del GamePad. L'impostazione predefinita è GamePadDeadZone.IndependentAxes, il che significa che ogni asse viene verificato individualmente rispetto alla zona morta. Ciò tende a far scattare l'ingresso su ciascun asse della levetta analogica. Invece, prova a usare GamePadDeadZone.Circular:

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

Questo dovrebbe darti un controllo molto più fluido su entrambi gli assi. Dai un'occhiata alla pagina MSDN e a questo articolo di Shawn Hargreaves .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.