Benutzerdefinierte Controller-Gerätezuordnungen hinzufügen

Die Game Controller-Bibliothek verwaltet eine interne Datenbank mit Controller-Geräten, die zur Konfiguration von Schaltflächen, dem Layout der Bewegungsachse, der Zuordnung für erkannte Controller und einer Standardzuordnung für nicht erkannte Controller verwendet wird. Die Datenbank enthält viele beliebte Controller, aber möglicherweise nicht alle Geräte, die für ein bestimmtes Spiel relevant sind. Die Game Controller-Bibliothek unterstützt die Anpassung durch Funktionen, die:

  • Rufen Sie die aktuelle Zuordnungsdatenbank ab.
  • Fügen Sie der vorhandenen Datenbank Einträge hinzu.
  • Vorhandene Datenbankeinträge ersetzen.
  • Die gesamte aktuelle Datenbank durch eine neue ersetzen.

Gerät identifizieren

Controller-Geräte werden anhand ihrer productId- und vendorId-Werte identifiziert. Jedes erkannte Controller-Gerät hat mindestens einen Eintrag in der Datenbank mit einem übereinstimmenden productId und vendorId. Die Controller-Zuordnungsstruktur umfasst Felder, in denen ein minimaler und maximaler Android API-Bereich für den Eintrag angegeben wird. In der Datenbank können mehrere Einträge mit derselben productId und vendorId vorhanden sein, sofern sie eindeutige minimale und maximale API-Bereiche haben.

Aktuelle Daten zur Neuzuordnung lesen

Mit der Funktion Paddleboat_getControllerRemapTableData können Sie die Daten der aktuellen Neuzuordnung abrufen.

int32_t Paddleboat_getControllerRemapTableData(
   const int32_t destRemapTableEntryCount,
   Paddleboat_Controller_Mapping_Data* mappingData)

Paddleboat_getControllerRemapTableData gibt die Gesamtzahl der Neuzuordnungseinträge zurück, die in der internen Datenbank vorhanden sind.

Parameter Beschreibung
destRemapTableEntryCount Die Arraygröße von Paddleboat_Controller_Mapping_Data-Elementen, die im Parameter mappingData übergeben werden.
mappingData Ein Zeiger auf ein Array von Paddleboat_Controller_Mapping_Data-Elementen.

Wenn destRemapTableEntryCount kleiner als die Gesamtzahl der neu zugeordneten Einträge ist, wird nur die durch destRemapTableEntryCount angegebene Anzahl von Einträgen in mappingData kopiert.

Daten zur Neuzuordnung hinzufügen oder ersetzen

Verwenden Sie die Funktion Paddleboat_addControllerRemapData, um Einträge zur Neuzuordnung hinzuzufügen oder die aktuelle Datenbank für die Neuzuordnung zu ersetzen.

void Paddleboat_addControllerRemapData(
   const Paddleboat_Remap_Addition_Mode addMode,
   const int32_t remapTableEntryCount,
   const Paddleboat_Controller_Mapping_Data* mappingData)
Parameter Beschreibung
addMode Die für den Vorgang verwendeten Additionsregeln. Gültige Werte sind PADDLEBOAT_REMAP_ADD_MODE_DEFAULT und PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL.
remapTableEntryCount Die Arraygröße von Paddleboat_Controller_Mapping_Data-Elementen, die im Parameter mappingData übergeben werden.
mappingData Ein Zeiger auf ein Array von Paddleboat_Controller_Mapping_Data-Elementen.

Zusätzliche Modi

Wenn PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL in addMode angegeben ist, wird die vorhandene Datenbank gelöscht und durch den Inhalt des neuen Arrays ersetzt.

Wenn PADDLEBOAT_REMAP_ADD_MODE_DEFAULT in addMode angegeben ist, werden die folgenden Kriterien auf jedes Element im Array angewendet, das in mappingData übergeben wird:

  • Wenn ein Paddleboat_getControllerRemapTableData eindeutig ist (also vendorId und productId noch nicht vorhanden sind oder aber einen nicht überlappenden minApi- oder maxApi-Bereich hat), wird der Eintrag der internen Datenbank hinzugefügt.
  • Wenn der Paddleboat_getControllerRemapTableData nicht eindeutig ist (vendorId und productId vorhanden und es eine Überschneidung von minApi oder maxApi gibt), ersetzt er den vorhandenen Eintrag in der internen Datenbank.

Die Paddleboat_Controller_Mapping_Data-Struktur ist:

typedef struct Paddleboat_Controller_Mapping_Data {
    int16_t minimumEffectiveApiLevel; /** Min. API level for this entry */
    int16_t maximumEffectiveApiLevel; /** Max. API level, 0 = no max */
    int32_t vendorId; /** VendorID of the controller device for this entry */
    int32_t productId; /** ProductID of the controller device for this entry */
    int32_t flags; /** Flag bits, will be ORed with
                     * Paddleboat_Controller_Info.controllerFlags */

    /** AMOTION_EVENT_AXIS value for the corresponding Paddleboat control axis,
     *  or PADDLEBOAT_AXIS_IGNORED if unsupported. */
    uint16_t axisMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];
    /** Button to set on positive or negative axis value,
     *  PADDLEBOAT_AXIS_BUTTON_IGNORED if none. */
    uint8_t axisPositiveButtonMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];
    uint8_t axisNegativeButtonMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];
    /** AKEYCODE_ value corresponding with the corresponding Paddleboat button.
     *  PADDLEBOAT_BUTTON_IGNORED if unsupported. */
    uint16_t buttonMapping[PADDLEBOAT_BUTTON_COUNT];
} Paddleboat_Controller_Mapping_Data;

Zuordnungsbeispiel

Im Folgenden sehen Sie ein Paddleboat_Controller_Mapping_Data, das einen Google Stadia-Controller beschreibt:

#define PADDLEBOAT_AXIS_BUTTON_DPAD_UP 0
#define PADDLEBOAT_AXIS_BUTTON_DPAD_LEFT 1
#define PADDLEBOAT_AXIS_BUTTON_DPAD_DOWN 2
#define PADDLEBOAT_AXIS_BUTTON_DPAD_RIGHT 3
#define PADDLEBOAT_AXIS_BUTTON_L2 9
#define PADDLEBOAT_AXIS_BUTTON_R2 12

static const Paddleboat_Controller_Mapping_Data stadia_controller_map[] = {
    16, 0, 0x18d1, 0x9400, PADDLEBOAT_CONTROLLER_LAYOUT_STANDARD,
    {
        /* LX */ AMOTION_EVENT_AXIS_X,
        /* LY */ AMOTION_EVENT_AXIS_Y,
        /* RX */ AMOTION_EVENT_AXIS_Z,
        /* RY */ AMOTION_EVENT_AXIS_RZ,
        /* L1 */ PADDLEBOAT_AXIS_IGNORED,
        /* L2 */ AMOTION_EVENT_AXIS_BRAKE,
        /* R1 */ PADDLEBOAT_AXIS_IGNORED,
        /* R2 */ AMOTION_EVENT_AXIS_GAS,
        /* HX */ AMOTION_EVENT_AXIS_HAT_X,
        /* HY */ AMOTION_EVENT_AXIS_HAT_Y,
    },
    {
        /* LX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* LY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* RX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* RY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* L1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* L2 */ PADDLEBOAT_AXIS_BUTTON_L2,
        /* R1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* R2 */ PADDLEBOAT_AXIS_BUTTON_R2,
        /* HX */ PADDLEBOAT_AXIS_BUTTON_DPAD_RIGHT,
        /* HY */ PADDLEBOAT_AXIS_BUTTON_DPAD_DOWN,
    },
    {
        /* LX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* LY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* RX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* RY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* L1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* L2 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* R1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* R2 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* HX */ PADDLEBOAT_AXIS_BUTTON_DPAD_LEFT,
        /* HY */ PADDLEBOAT_AXIS_BUTTON_DPAD_UP,
    },
    {
        /* UP     */ AKEYCODE_DPAD_UP,
        /* LEFT   */ AKEYCODE_DPAD_LEFT,
        /* DOWN   */ AKEYCODE_DPAD_DOWN,
        /* RIGHT  */ AKEYCODE_DPAD_RIGHT,
        /* A      */ AKEYCODE_BUTTON_A,
        /* B      */ AKEYCODE_BUTTON_B,
        /* X      */ AKEYCODE_BUTTON_X,
        /* Y      */ AKEYCODE_BUTTON_Y,
        /* L1     */ AKEYCODE_BUTTON_L1,
        /* L2     */ AKEYCODE_BUTTON_L2,
        /* L3     */ AKEYCODE_BUTTON_THUMBL,
        /* R1     */ AKEYCODE_BUTTON_R1,
        /* R2     */ AKEYCODE_BUTTON_R2,
        /* R3     */ AKEYCODE_BUTTON_THUMBR,
        /* SELECT */ AKEYCODE_BUTTON_SELECT,
        /* START  */ AKEYCODE_BUTTON_START,
        /* SYSTEM */ AKEYCODE_BUTTON_MODE,
        /* TOUCHP */ PADDLEBOAT_BUTTON_IGNORED,
        /* AUX1   */ PADDLEBOAT_BUTTON_IGNORED,
        /* AUX2   */ PADDLEBOAT_BUTTON_IGNORED,
        /* AUX3   */ PADDLEBOAT_BUTTON_IGNORED,
        /* AUX4   */ PADDLEBOAT_BUTTON_IGNORED
    }
};