Thumbstick do Xbox usado para girar sprite, a fórmula básica faz com que ele fique "grudado" ou "grudento" em intervalos de 90 graus! Como você obtém rotação suave?

9

Estou usando uma fórmula muito básica para calcular qual ângulo meu sprite (nave espacial, por exemplo) deve estar enfrentando com base no polegar do controlador Xbox, ou seja, você usa o polegar para girar a nave.

No meu principal método de atualização:

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

No meu método principal de desenho:

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

Como você pode ver, é bastante simples, pego os radianos atuais do manípulo e os guardo em um flutuador shuttleAnglee depois o uso como argumento do ângulo de rotação (em radianos) para desenhar o ônibus espacial.

Por alguma razão, quando eu giro o sprint, ele fica pegajoso nos ângulos de 0, 90, 180 e 270 graus. Ele quer se estabelecer nesses ângulos. Não está me dando uma rotação suave e natural como eu me sentiria em um jogo que usa um mecânico semelhante. PS: Meu controle Xbox está bem!

Hugh
fonte
11
Atan2 não pega primeiro o valor Y e depois o valor X? msdn.microsoft.com/en-us/library/system.math.atan2.aspx . Você precisa trocar seu valor xey primeiro. Você também considerou facilitar seus valores por interpolação? toValue-currentValue / speed
Sidar
Desculpe, eu quis dizer newShuttleAngle - oldShuttleAngle / speed.
Sidar
Isso afetaria apenas a orientação visual e depende inteiramente de como a imagem da textura é orientada - não vejo que isso afetou o problema dele.
Joe Shanahan
Esse é o Windows? Se assim definir o projeto para usar uma janela de console (Project -> Opções do Projecto -> Aplicativos -> Tipo de Saída) e imprimir o seu ângulo shuttleAnglepara ver se isso varas nesses ângulos
Joe Shanahan
2
wow great job SomeWritesReserved e todos os outros, estou realmente impressionado com este site, o feedback é tão rápido! é o meu primeiro post, então alguém pode me dizer o que preciso fazer para creditar corretamente todos aqueles que ajudaram?
Hugh,

Respostas:

18

Pode ser por causa de como a zona morta do GamePad funciona. O padrão é o GamePadDeadZone.IndependentAxesque significa que cada eixo é verificado individualmente contra a zona morta. Isso costuma fazer com que a entrada se encaixe em cada eixo do dedo analógico. Em vez disso, tente usar GamePadDeadZone.Circular:

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

Isso deve proporcionar um controle muito mais suave nos dois eixos. Confira a página do MSDN e este artigo de Shawn Hargreaves .

SomeWritesReserved
fonte