Ich habe einen XBox360-Controller, den ich als Eingabe für eine Anwendung verwenden möchte.
Was ich nicht herausfinden kann, ist die Best-Practice-Methode, um dies über eine Schnittstelle herauszustellen.
Hinter den Kulissen ist die Klasse, die die Controller verwaltet, auf den Status der Abfragetasten angewiesen.
Ich habe anfangs etwas Link ausprobiert:
Event ButtonPressed() as ButtonEnum
wo ButtonEnum
war ButtonRed
, ButtonStart
usw ...
Dies ist insofern etwas eingeschränkt, als es nur das Drücken von Tasten und nicht das Halten / Mustern (zweimal drücken usw.) unterstützt.
Die nächste Idee war, einfach den Schaltflächenstatus für die App freizugeben, z
Property RedPressed as Boolean
Property StartPressed as Boolean
Property Thumb1XAxis as Double
Dies ist sehr flexibel, erzwingt jedoch zu viel Arbeit in der App und erfordert das Abfragen der App - ich würde es vorziehen, wenn es nach Möglichkeit ereignisgesteuert ist.
Ich habe darüber nachgedacht, mehrere Ereignisse hinzuzufügen, zB:
Event ButtonPressed(Button as ButtonEnum)
Event ButtonPressedTwice(Button as ButtonEnum)
Event ButtonHeldStart(Button as ButtonEnum)
Event ButtonHeldEnd(Button as ButtonEnum)
aber das scheint ein wenig klobig zu sein und war ein echtes Problem auf dem Bildschirm "Schaltfläche binden".
Kann mir jemand bitte den "richtigen" Weg weisen, um mit Eingaben von Controllern umzugehen.
NB: Ich benutze SlimDX in der Klasse, die das Interface implementiert. Dadurch kann ich den Status sehr leicht ablesen. Alle Alternativen, die mein Problem lösen würden, werden ebenfalls geschätzt
Ehrlich gesagt würde ich sagen, dass die optimale Benutzeroberfläche stark von der Verwendung im Spiel abhängt. Für ein allgemeines Anwendungsszenario würde ich jedoch eine zweistufige Architektur vorschlagen, die ereignisbasierte und abrufbasierte Ansätze trennt.
Die untere Ebene kann als "abrufbasierte" Ebene betrachtet werden und zeigt den aktuellen Status einer Schaltfläche an. Eine solche Schnittstelle könnte einfach 2 Funktionen haben,
GetAnalogState(InputIdentifier)
undGetDigitalState(InputIdentifier)
woInputIdentifier
ist ein Aufzählungswert, der angibt, gegen welche Schaltfläche, welchen Auslöser oder welchen Stick Sie prüfen. (Wenn Sie GetAnalogState für eine Schaltfläche ausführen, wird 1.0 oder 0.0 zurückgegeben, und wenn Sie GetDigitalState für einen analogen Stick ausführen, wird true zurückgegeben, wenn ein voreingestellter Schwellenwert überschritten wird, oder andernfalls false.)Die zweite Schicht würde dann die untere Schicht verwenden, um Ereignisse bei Statusänderungen zu generieren und es Elementen zu ermöglichen, sich für Rückrufe zu registrieren (C # -Ereignisse sind großartig). Diese Rückrufe würden Ereignisse für Presse, Veröffentlichung, Tippen, Langhalten usw. beinhalten. Für einen analogen Stick könnten Sie Gesten einschließen, z. B. QCF für ein Kampfspiel. Die Anzahl der angezeigten Ereignisse hängt davon ab, wie detailliert ein Ereignis ist, das Sie auslösen möchten. Sie könnten einfach ein einfaches abfeuern,
ButtonStateChanged(InputIdentifier)
wenn Sie alles andere in einer separaten Logik behandeln möchten.Wenn Sie also den aktuellen Status einer Eingabetaste oder eines Steuerknüppels überprüfen müssen, überprüfen Sie die untere Ebene. Wenn Sie eine Funktion bei einem Eingabeereignis einfach auslösen möchten, registrieren Sie sich für einen Rückruf von der zweiten Ebene.
quelle