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