Próbuję pozwolić graczowi nacisnąć dowolny przycisk, aby przejść ze strony głównej. Udało mi się to zrobić, tworząc listę przycisków, przeglądając je i sprawdzając, czy jeden z nich nie działa; jednak wydaje mi się, że ten kod jest trochę brzydki i zastanawiam się, czy istnieje prostszy sposób na zrobienie tego, o czym po prostu nie myślę?
Oto mój wygląd teraz mojego kodu:
if (GamePad.GetState(PlayerIndex.One).IsConnected)
{
var buttonList = new List<Buttons>()
{
{Buttons.A},
{Buttons.B},
{Buttons.Y},
{Buttons.X},
{Buttons.Start},
{Buttons.Back},
{Buttons.RightShoulder},
{Buttons.LeftShoulder},
{Buttons.RightTrigger},
{Buttons.LeftTrigger}
};
foreach (var button in buttonList)
{
if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
ExitMainMenu= true;
}
}
Odpowiedzi:
To powinno wystarczyć. Na końcu każdej pętli aktualizacji zapisz stan
previousGamePadState
. Następnie możesz je porównać. To szybki sposób na wykrycie zmian. Nie ma potrzeby zapętlania.GamePadState.PacketNumber :
Za pomocą parametru PacketNumber można ustalić, czy zmienił się stan wejściowy. Jeśli wartość PacketNumber pozostaje taka sama między dwoma kolejnymi wywołaniami GetState, oznacza to, że dane wejściowe nie uległy zmianie.
EDYCJA: Zmieniono na metodę. Nie gwarantuje się, że będzie działał poprawnie, ale powinien działać. Ponadto, ponieważ to naprawdę wykrywa zmiany w danych wejściowych, więc jeśli użytkownik zwolni przycisk, widać to również z tym. Dodałem również,
if
aby wykryć ruch kciuka, abyś mógł je przynajmniej zignorować.Mam nadzieję, że to ci pomoże. Daj mi znać, jeśli to nie odpowiada Twoim potrzebom, jestem pewien, że możemy to rozwiązać.
Instrukcje : wykrywanie naciśnięcia przycisku kontrolera w tej ramce Właściwość GamePadState.PacketNumber
źródło
GamePadState
ienum Buttons
, który jest bliższy kontekstowi, z którego korzysta OP.Jeśli nie przeszkadza ci użycie Reflection, możesz użyć czegoś takiego: (być może nawet dokładnie tego):
źródło
Możesz ręcznie skonstruować pustą
GamePadState
, a następnie sprawdzić, czy jest (nie) równość z bieżącą rzeczywistą, którą pobierasz przez wywołanieGamePad.GetState
.źródło
Equals
jest inny; porównuje dwa odniesienia dla tego samego wystąpienia. AleGamePadState
przeciąża operator ==, aby porównać ich wartości, które podłączyłem w mojej odpowiedzi (op_Equality
).Ponieważ Buttons jest enumaracją, możesz użyć metody Enum.GetValues w następujący sposób:
źródło