XInput UDF - Game Controller

  • Servus :)

    Nach langer Zeit brauche ich AutoIt tatsächlich mal wieder. In diesem Fall habe ich den Input von einem Game Controller benötigt. Da mir die bisherigen UDF nicht so gefallen haben, hab ich eine 1:1 Übersetzung der XInput.h geschrieben. Diese umfasst sämtliche Konstanten und DLL Calls, welche die XInput API mitliefern. Die Dokumentation dazu findet ihr hier:

    XInput - MSDN

    Im Anhang findet ihr die UDF! Wie gesagt, es handelt sich dabei um eine 1:1 Übersetzung der XInput.h welche für C / C++ zur Verfügung stehen. Einige Hinweise:

    Konstanten sind im $XINPUT_*-Format (Eigentlich genau so, wie es die Doku anzeigt, lediglich mit $ am Anfang)

    Strukturen sind im $_XINPUT_*-Format (Auch wie es die Doku anzeigt, mit $ am Anfang)

    Funktionen sind im XInput*()-Format (Doku :d)

    Hilfsfunktionen intern für die UDF sind mit _XINPUT_*() deklariert. (Da müsst und solltet ihr normalerweise nicht drauf zugreifen...)

    Ein einfaches Beispiel um den Button Status auszulesen (also welche Buttons auf einen Controller gedrückt sind):

    Bei Problemen, Fragen und Anregungen stehe ich euch zur Verfügung!

  • Schöne Idee, leider unvollständig wegen der 1:1 Übersetzung.

    Return DllCall(...)[0] Das kann doch nicht dein Ernst sein, direkt auf den Index zugreifen ohne zu prüfen ob der Call erfolgreich war?

    Sollte dein DllCall aus welchen Gründen auch immer abschmieren (auch Standardfunktionen crashen ab und zu!), dann stürzt das gesamte Script ab.

    Bin ich blind oder hast du in der UDF absolut keine Fehlerbehandlung?

    Die Returncodes der xinput.h geben ja oft dwords zurück die einen Statuscode beinhalten.

    - ERROR_SUCCESS (GUID_NULL)

    - ERROR_DEVICE_NOT_CONNECTED

    - If the function fails, it returns a valid Win32 error code.

    - If the function fails, the return value is an error code defined in Winerror.h (dort sind auch ERROR_SUCCESS, ERROR_DEVICE_NOT_CONNECTED enthalten)

    Wo ist das dazugehörige Exception Handling und die Konstanten im Code?

    Wenn ich die UDF nutze und meinen Controller abziehe, habe ich keine Möglichkeit festzustellen, ob er noch dran ist oder nicht.

    Die Funktion die die Buttons pullt sollte direkt zurückgeben ob das erfolgreich war oder nicht, und dazu sollten die Konstanten existieren.

    Das tut sie zwar, aber ich habe keine Möglichkeit die Werte mit den Fehlerkonstanten zu vergleichen. Auch etwas vergleichliches mit XInputGetLastError() gibts nicht (was das decken könnte).

    Sowas wie:

    AutoIt
    Do
        $iErrCode = XInputGetState(0, $tState)
    
        ;Game Routine
    Until $iErrCode <> $ERROR_SUCCESS
    
    MsgBox(64, "XInput", "Ein Fehler mit dem Controller ist aufgetreten" & @CRLF & $iErrCode)

    Sie 1:1 zu übersetzen ist nicht sehr hilfreich wenn man nicht weiß was man im Falle eines Fehlers machen soll.

    Von der Funktionalität mal ganz abgesehen, die UDF läuft ja wenn man weiß was hinter den Kulissen abgeht, letzteres sollte bei UDFs aber notwendigerweise nicht Voraussetzung sein.

  • Zitat

    Das kann doch nicht dein Ernst sein, direkt auf den Index zugreifen ohne zu prüfen ob der Call erfolgreich war?

    Doch, das ist mein Ernst. Gerade weil die Funktionen von XInput eine Interne Fehlerverarbeitung haben und dies hauptsächlich den Error Code zurück schmeißen, klappt das so wunderbar.

    Zitat

    Sollte dein DllCall aus welchen Gründen auch immer abschmieren (auch Standardfunktionen crashen ab und zu!), dann stürzt das gesamte Script ab.

    Bisher ist mir kein DllCall abgeschmiert, wenn der DllCall korrekt implementiert wurde. In meinen 8 Jahren Programmiererfahrung nicht einmal! Und ich spiele schon sehr viel mit DllCalls herum,... Ich bezweifel dass du das sogar absichtilich bei der UDF erzeigen kannst, wenn du die Funktionen benutzt wo ich schön die DllCalls drin verpackt habe.

    Zitat

    Die Returncodes der xinput.h geben ja oft dwords zurück die einen Statuscode beinhalten.

    Diese sind aber nicht in der XInput.h beschrieben, sondern in der WinError.h ... Und diese hat ne Menge an #define Anweisungen. Ich meine, ich kann da mal ein AutoIt Skript drüber jagen und die alle #define Anweisungen einmal in AutoIt Konstanten konvertieren, ob das weiterhilft ist eine andere Frage. Das Einfachste Error Handling ist es, den Rückgabewert der Funktion gegen 0 zu prüfen. Fertig... Und das ist eigentlich genau das, was du da in deinem Beispiel kurz veranschaulicht hast...

    Zitat

    Wenn ich die UDF nutze und meinen Controller abziehe, habe ich keine Möglichkeit festzustellen, ob er noch dran ist oder nicht.

    Doch, hast du... Da jede Funktion dir dann einen anderen Rückgabewert als "0" entgegen schmeißt.


    Mir ist klar, dass du bemängelst, dass ich keinen Support für Fehlermanagement eingebaut habe. Werde ich aber nicht implementieren da ich für meine eigene Anwendung nunmal den Overhead, was für die Fehlerverarbeitung unumgänglich ist, komplett minimiert haben wollte. Deswegen auch nur eine 1:1 Übersetzung der XInput.h

    Ich habe hier lediglich die UDF geteilt, da es ggf. für den einen oder anderen nützlich sein könnte. Vor allem da derjenige dann die Funktionen nicht selber via DllCall aufrufen muss + die Strukturen vorab erstellen. Ich habe kein Interesse daran die UDF weiter auszubauen da sie für meine Zwecke reicht. Es ging mir primär nur darum, diese zu teilen. Wer noch mehr braucht, kann sich entsprechendes selber implementieren. :p

    Sollte allerdings die Nachfrage groß genug sein, kann ich mir mal überlegen ob ich entsprechende Fehlerverarbeitung doch noch implementiere. Aber bisher habe ich kaum Fragen hier im Forum gesehen, welche sich auf Gamepads bezogen.

    Einmal editiert, zuletzt von Yjuq (25. Juni 2018 um 12:15)