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 (alsovendorId
undproductId
noch nicht vorhanden sind oder aber einen nicht überlappendenminApi
- odermaxApi
-Bereich hat), wird der Eintrag der internen Datenbank hinzugefügt. - Wenn der
Paddleboat_getControllerRemapTableData
nicht eindeutig ist (vendorId
undproductId
vorhanden und es eine Überschneidung vonminApi
odermaxApi
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
}
};