Mam kontroler XBox360, którego chciałbym użyć jako danych wejściowych dla aplikacji.
To, czego nie mogę wypracować, to najlepszy sposób na ujawnienie tego za pośrednictwem interfejsu.
Za kulisami klasa, która obsługuje kontroler (kontrolery), opiera się na stanie przycisku odpytywania.
Początkowo próbowałem coś link:
Event ButtonPressed() as ButtonEnum
gdzie ButtonEnum
był ButtonRed
, ButtonStart
itd ...
Jest to trochę ograniczone, ponieważ obsługuje tylko naciśnięcia przycisków, a nie blokady / wzory (naciśnij dwukrotnie itp.)
Kolejnym pomysłem było po prostu ujawnienie stanu przycisku aplikacji, np
Property RedPressed as Boolean
Property StartPressed as Boolean
Property Thumb1XAxis as Double
Jest to bardzo elastyczne, ale tak naprawdę wymusza zbyt wiele pracy w aplikacji i wymaga odpytywania aplikacji - wolałbym kierować zdarzeniami, jeśli to możliwe.
Rozważałem dodanie wielu wydarzeń, np .:
Event ButtonPressed(Button as ButtonEnum)
Event ButtonPressedTwice(Button as ButtonEnum)
Event ButtonHeldStart(Button as ButtonEnum)
Event ButtonHeldEnd(Button as ButtonEnum)
ale wydaje się to trochę niezgrabne i było prawdziwym bólem na ekranie „Bind button”.
Czy ktoś może wskazać mi „prawidłowy” sposób obsługi danych wejściowych z kontrolerów.
NB: Używam SlimDX w klasie, która implementuje interfejs. To pozwala mi bardzo łatwo odczytać stan. Doceniamy również wszelkie alternatywy, które mogłyby rozwiązać mój problem
źródło
Szczerze mówiąc, powiedziałbym, że optymalny interfejs będzie w dużym stopniu zależał od użycia w grze. Jednak w przypadku ogólnego scenariusza użytkowania sugerowałbym architekturę dwuwarstwową, która oddziela podejścia oparte na zdarzeniach i odpytywaniu.
Warstwę niższą można uznać za warstwę „opartą na sondowaniu” i ujawnia bieżący stan przycisku. Jeden z takich interfejsów może po prostu mieć 2 funkcje,
GetAnalogState(InputIdentifier)
aGetDigitalState(InputIdentifier)
gdzieInputIdentifier
jest wyliczona wartość reprezentująca, z którym przyciskiem, spustem lub drążkiem sprawdzasz. (Uruchomienie GetAnalogState dla przycisku zwróci 1,0 lub 0,0, a uruchomienie GetDigitalState dla drążka analogowego zwróci wartość true, jeśli przekroczy ustalony próg, lub false w przeciwnym razie).Drugi poziom używałby następnie niższego poziomu do generowania zdarzeń po zmianie stanu i pozwalał elementom rejestrować się dla wywołań zwrotnych (zdarzenia C # są chwalebne). Te wywołania zwrotne obejmowałyby zdarzenia dla prasy, zwolnienia, dotknięcia, przytrzymania itd. W przypadku drążka analogowego możesz dołączyć gesty, np. QCF do walki. Liczba ujawnionych zdarzeń zależy od stopnia szczegółowości zdarzenia, które chcesz wywołać. Możesz po prostu wystrzelić prosty,
ButtonStateChanged(InputIdentifier)
jeśli chcesz obsłużyć wszystko inne w osobnej logice.Jeśli więc chcesz sprawdzić bieżący stan przycisku wprowadzania lub drążka sterującego, sprawdź dolny poziom. Jeśli chcesz po prostu odpalić funkcję po zdarzeniu wejściowym, zarejestruj się, aby uzyskać oddzwonienie z drugiej warstwy.
źródło