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!


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.