¡La barra de control Xbox utilizada para rotar sprites, la fórmula básica hace que se "pegue" o se sienta "pegajosa" a intervalos de 90 grados! ¿Cómo se obtiene una rotación suave?

9

Estoy usando una fórmula muy básica para calcular a qué ángulo debe enfrentar mi sprite (por ejemplo, la nave espacial) en función del control del mando Xbox, es decir, se usa el control para girar la nave.

En mi método de actualización principal:

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

En mi método de dibujo principal:

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

Como puede ver, es bastante simple, tomo los radianes actuales de la barra de control y los guardo en un flotador shuttleAngley luego los uso como argumento del ángulo de rotación (en radianes) para dibujar el transbordador.

Por alguna razón, cuando giro el sprint, se siente pegajoso en ángulos de 0, 90, 180 y 270 grados. Quiere establecerse en esos ángulos. No me está dando una rotación suave y natural como me sentiría en un juego que usa una mecánica similar. PD: ¡Mi controlador Xbox está bien!

Hugh
fuente
1
¿Atan2 no toma primero el valor Y y luego el valor X? msdn.microsoft.com/en-us/library/system.math.atan2.aspx . Primero debe intercambiar su valor x e y. ¿También ha considerado facilitar sus valores por interpolación? toValue-currentValue / speed
Sidar
Lo siento, quise decir newShuttleAngle - oldShuttleAngle / speed.
Sidar
Eso solo afectaría la orientación visual y eso depende completamente de la forma en que se orienta la imagen para la textura; no puedo ver que eso haya afectado su problema.
Joe Shanahan
¿Es esto Windows? Si es así, configure el proyecto para usar una ventana de consola (Proyecto -> Opciones de proyecto -> Aplicación -> Tipo de salida) e imprima su ángulo shuttleAnglepara ver si eso se queda en esos ángulos
Joe Shanahan
2
wow gran trabajo SomeWritesReserved y todos los demás, estoy realmente impresionado con este sitio, ¡los comentarios son muy rápidos! es mi primera publicación, ¿alguien puede decirme qué debo hacer para acreditar adecuadamente a todos los que ayudaron?
Hugh

Respuestas:

18

Puede deberse a cómo funciona la zona muerta de GamePad. Su valor predeterminado es GamePadDeadZone.IndependentAxes, lo que significa que cada eje se verifica contra la zona muerta individualmente. Esto tiende a hacer que la entrada se ajuste a cada eje del joystick analógico. En su lugar, intente usar GamePadDeadZone.Circular:

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

Esto debería darle un control mucho más suave en ambos ejes. Echa un vistazo a la página de MSDN y este artículo de Shawn Hargreaves .

SomeWritesReserved
fuente