Mysz Xbox używana do obracania ikonki, podstawowa formuła sprawia, że ​​„przykleja się” lub czuje się „lepka” w odstępach 90 stopni! Jak uzyskać płynny obrót?

9

Korzystam z bardzo podstawowej formuły, aby obliczyć, pod jakim kątem mój duszek (na przykład statek kosmiczny) powinien być skierowany, w oparciu o drążek kontrolera Xbox, tzn. Za pomocą drążka obracasz statek.

W mojej głównej metodzie aktualizacji:

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

W mojej głównej metodzie losowania:

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

Jak widać, jest to dość proste: biorę bieżące radiany z pinezki i przechowuję je w pływaku, shuttleAnglea następnie używam tego jako argumentu kąta obrotu (w radianach) do rysowania wahadłowca.

Z jakiegoś powodu, gdy obracam sprint, wydaje się lepki przy kątach 0, 90, 180 i 270 stopni. Chce osiedlić się pod tymi kątami. Nie zapewnia mi to płynnej i naturalnej rotacji, jaką czułbym w grze, która używa podobnej mechaniki. PS: Mój kontroler Xbox jest w porządku!

Hugh
źródło
1
Czy Atan2 nie bierze najpierw wartości Y, a następnie wartości X? msdn.microsoft.com/en-us/library/system.math.atan2.aspx . Najpierw musisz zamienić swoją wartość xiy. Czy rozważałeś także złagodzenie swoich wartości przez interpolację? toValue-currentValue / speed
Sidar,
Przepraszam, miałem na myśli newShuttleAngle - oldShuttleAngle / speed.
Sidar,
Wpłynęłoby to tylko na orientację wizualną i zależy to całkowicie od tego, w jaki sposób orientowany jest obraz tekstury - nie widzę, żeby miało to wpływ na jego problem.
Joe Shanahan,
Czy to jest Windows? Jeśli tak, ustaw projekt w oknie konsoli (Projekt -> Opcje projektu -> Aplikacja -> Typ wyniku) i wydrukuj swój kąt, shuttleAngleaby zobaczyć, czy to trzyma się pod tymi kątami
Joe Shanahan
2
wow świetna robota SomeWritesReserved i wszyscy inni, jestem pod wrażeniem tej strony, opinie są tak szybkie! to mój pierwszy post, więc czy ktoś może mi powiedzieć, co muszę zrobić, aby należycie podziękować wszystkim, którzy pomogli?
Hugh

Odpowiedzi:

18

Może to być spowodowane działaniem martwej strefy GamePada. Domyślnie wartość GamePadDeadZone.IndependentAxesta oznacza, że ​​każda oś jest sprawdzana indywidualnie względem strefy martwej. Powoduje to, że sygnał wejściowy jest przyciągany do każdej osi analogowego drążka sterowego. Zamiast tego spróbuj użyć GamePadDeadZone.Circular:

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

Powinno to zapewnić znacznie płynniejszą kontrolę w obu osiach. Sprawdź stronę MSDN i ten artykuł autorstwa Shawna Hargreavesa .

SomeWritesReserved
źródło