Benutzerdefinierte Controller-Gerätezuordnungen hinzufügen

Die Game Controller-Bibliothek enthält eine interne Datenbank mit Controllergeräten, die zum Konfigurieren von Tasten, Layout der Bewegungsachse, 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 mit Funktionen, die Folgendes ermöglichen:

  • Rufen Sie die aktuelle Mapping-Datenbank 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 Controllergerät hat mindestens einen Eintrag in der Datenbank mit einer übereinstimmenden productId und vendorId. Die Struktur der Controllerzuordnung enthält Felder, in denen ein qualifizierender Mindest- und Höchstbereich für die Android-API für den Eintrag angegeben wird. In der Datenbank können mehrere Einträge mit demselben productId und vendorId vorhanden sein, sofern sie eindeutige minimale und maximale API-Bereiche haben.

Aktuelle Daten zur Neuzuordnung abrufen

Verwenden Sie die Funktion Paddleboat_getControllerRemapTableData, um die aktuellen Daten für die Neuzuordnung abzurufen.

int32_t Paddleboat_getControllerRemapTableData(
   const int32_t destRemapTableEntryCount,
   Paddleboat_Controller_Mapping_Data* mappingData)

Paddleboat_getControllerRemapTableData gibt die Gesamtzahl der Einträge für die Neuzuordnung in der internen Datenbank zurück.

Parameter Beschreibung
destRemapTableEntryCount Die Array-Größ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 Neuzuordnungseinträge ist, wird nur die durch destRemapTableEntryCount angegebene Anzahl von Einträgen in mappingData kopiert.

Remap-Daten hinzufügen oder ersetzen

Mit der Funktion Paddleboat_addControllerRemapData können Sie Remap-Einträge hinzufügen oder die aktuelle Remap-Datenbank 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 Array-Größ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.

Additionsmodi

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 (d. h. vendorId und productId noch nicht vorhanden sind oder vorhanden sind, aber einen nicht überlappenden minApi- oder maxApi-Bereich haben), wird der Eintrag der internen Datenbank hinzugefügt.
  • Wenn die Paddleboat_getControllerRemapTableData nicht eindeutig ist (vendorId und productId sind vorhanden und es gibt eine minApi- oder maxApi-Überschneidung), wird der vorhandene Eintrag in der internen Datenbank ersetzt.

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;

Beispiel für die Zuordnung

Im Folgenden sehen Sie ein Beispiel für ein Paddleboat_Controller_Mapping_Data, das zur Beschreibung eines Google Stadia-Controllers verwendet wird:

#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
    }
};