Benutzerdefinierte Controller-Gerätezuordnungen hinzufügen

Die Game Controller-Bibliothek verwaltet eine interne Controller-Datenbank. Geräte, mit denen Schaltflächen, das Layout der Bewegungsachsen, die Zuordnung von erkannte Controller und eine Standardzuordnung für nicht erkannte Controller. Die Datenbank viele gängige Controller enthält, aber möglicherweise nicht alle Geräte die für ein bestimmtes Spiel relevant sind. Die Game Controller-Bibliothek unterstützt Anpassungen Funktionen, die folgende Möglichkeiten bieten:

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

Gerät identifizieren

Controller werden anhand ihrer Werte für productId und vendorId identifiziert. Für jedes erkannte Controller-Gerät ist mindestens ein Eintrag in der Datenbank mit einem Übereinstimmung mit productId und vendorId. Die Controller-Zuordnungsstruktur umfasst Felder, die einen geeigneten minimalen und maximalen Android API-Bereich für die zu erstellen. Mehrere Einträge mit den gleichen productId und vendorId können vorhanden sein in solange sie eindeutige minimale und maximale API-Bereiche haben.

Aktuelle Daten für neu kartierte Karten lesen

Mit der Funktion Paddleboat_getControllerRemapTableData können Sie 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 neu kartierten Elemente zurück. die in der internen Datenbank vorhanden sind.

Parameter Beschreibung
destRemapTableEntryCount Die Array-Größe von Paddleboat_Controller_Mapping_Data-Elemente mappingData übergeben wird.
mappingData Ein Zeiger auf ein Array von Paddleboat_Controller_Mapping_Data-Elemente.

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

Neuzuordnungsdaten hinzufügen oder ersetzen

Verwenden Sie die Funktion Paddleboat_addControllerRemapData, um neu zuordnen oder die aktuelle Datenbank für die Neuzuordnung 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: PADDLEBOAT_REMAP_ADD_MODE_DEFAULT oder PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL
remapTableEntryCount Die Array-Größe von Paddleboat_Controller_Mapping_Data-Elemente mappingData übergeben wird.
mappingData Ein Zeiger auf ein Array von Paddleboat_Controller_Mapping_Data-Elemente.

Hinzufügungsmodi

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

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

  • Wenn eine Paddleboat_getControllerRemapTableData eindeutig ist (d. h. der Wert vendorId und productId sind nicht bereits vorhanden oder existieren, haben jedoch einen nicht überlappender minApi- oder maxApi-Bereich), wird der Eintrag zum der internen Datenbank.
  • Wenn Paddleboat_getControllerRemapTableData nicht eindeutig ist (vendorId und productId vorhanden und es eine Überschneidung von minApi oder maxApi gibt, gilt Folgendes: ersetzt den vorhandenen Eintrag in der internen Datenbank.

Die Struktur Paddleboat_Controller_Mapping_Data sieht so aus:

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 für beschreiben Sie einen Google Stadia-Controller:

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