A banner image showing two game controllers

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.

A gif showing the xinput application

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.

An image showing code of the xinput system class

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.

An image showing code of the controller class

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.

RETURN

Diese Webseite verwendet keine Cookies und speichert keine Daten.
Viel Spaß beim surfen!

Alles klar!