XINPUT ANWENDUNG
Um mich intensiver mit C++ und der Windows API auseinanderzusetzten, habe ich bereits Ende 2021 begonnen, eigene Projekte im Kontext von Win32, C++ und Game Engines umzusetzen. Hier bot es sich an, ein Input System für Controller zu implementieren. Eine aktualisierte Variante des Input-Systems ist hier in meinem langfristigen Engine-Projekt zu finden.
IMPLEMENTIERUNG
Für die Implementierung habe ich mich am eventbasierten Input System
Rewired
für Unity orientiert. Mit diesem System habe ich sehr gerne gearbeitet. Anders als Inputs in Unity häufig über
if oder switch Strukturen innerhalb der Update Methode abgefragt wurden
(inzwischen hat Unity sein Input System grundsätzlich überarbeitet), können in Rewired Delegates für einzelne Input Events verwendet werden.
Dies macht das System etwas übersichtlicher und leichter handzuhaben, da unterschiedliche Subsysteme, die Input
verarbeiten, die Events einfach subscriben können und automatisch mit den nötigen Daten versorgt werden.
Selbstverständlich ist mein Input System nicht so ausführlich und umfangreich wie Rewired.
Es implementiert lediglich die Idee von Delegates als Events und nutzt unterschiedliche Button- und Axis-States.
So wird der State eines Buttons beispielsweise in dem Moment, in dem er gedrückt wird, zum State
_JUST_PRESSED_ und danach zum State _PRESSED_. So kann sehr leicht zwischen
Button-Aktionen unterschieden werden. Soll überprüft werden, ob der Button kontinuierlich gedrückt wird, wird das
ButtonPressed Event subscribed. Soll ein einzelner Klick unabhängig von der Haltedauer registriert
werden, wird das ButtonJustPressed Event subscribed.
Bei der Implementierung der Delegates hatte ich mit einigen Schwierigkeiten und Unklarheiten zu kämpfen, besonders,
wenn das gleiche Event von mehreren Instanzen subscribed wird. Außerdem war die Umsetzung von Function-Pointer
innerhalb einer Klasse herausfordernd. Diese Probleme habe ich zu dem Zeitpunkt nur vorläufig lösen können, was
jedoch nicht weiter schlimm war, da sie in dem Moment nicht die höchste Relevanz für mich hatten.
Das Projekt steht hier zum Download für Windows zur Verfügung.
Heute würde ich einige Aspekte anders umsetzen. Ich werde außerdem voraussichtlich ein neues XInput System in mein
kontinuierliches Projekt implementieren, welches hier zu finden ist.