La bibliothèque Game Controller gère une base de données interne de manettes, qui permet de configurer les boutons, la disposition des axes de mouvement, le mappage des manettes reconnues et un mappage par défaut pour les manettes non reconnues. La la base de données comprend de nombreuses manettes courantes, mais peut ne pas inclure tous les appareils pertinentes pour un jeu particulier. La bibliothèque Game Controller prend en charge les personnalisations grâce à des fonctions permettant de :
- Récupérer la base de données de mappage actuelle
- Ajouter des entrées à la base de données existante
- Remplacer les entrées de base de données existantes
- Remplacer toute la base de données actuelle par une nouvelle
Identifier un appareil
Les manettes sont identifiées par leurs valeurs productId
et vendorId
.
Chaque manette reconnue possède au moins une entrée dans la base de données, avec un productId
et un vendorId
correspondant. La structure de mappage de la manette inclut des champs qui spécifient une plage d'API Android minimale et maximale éligible pour l'entrée. Plusieurs entrées associées aux mêmes productId
et vendorId
peuvent exister dans la base de données, à condition qu'elles disposent de plages d'API minimales et maximales uniques.
Lire vos données de remappage actuelles
Utilisez la fonction Paddleboat_getControllerRemapTableData
pour récupérer les données de remappage actuelles.
int32_t Paddleboat_getControllerRemapTableData(
const int32_t destRemapTableEntryCount,
Paddleboat_Controller_Mapping_Data* mappingData)
Paddleboat_getControllerRemapTableData
renvoie le nombre total d'entrées de remappage présentes dans la base de données interne.
Paramètre | Description |
---|---|
destRemapTableEntryCount
|
La taille de tableau des éléments Paddleboat_Controller_Mapping_Data transmis au paramètre mappingData . |
mappingData
|
Un pointeur vers un tableau d'éléments Paddleboat_Controller_Mapping_Data . |
Si la valeur de destRemapTableEntryCount
est inférieure au nombre total d'entrées de remappage, seul le nombre d'entrées spécifié par destRemapTableEntryCount
est copié dans mappingData
.
Ajouter ou remplacer des données de remappage
Utilisez la fonction Paddleboat_addControllerRemapData
pour ajouter des entrées de remappage ou remplacer la base de données de remappage actuelle.
void Paddleboat_addControllerRemapData(
const Paddleboat_Remap_Addition_Mode addMode,
const int32_t remapTableEntryCount,
const Paddleboat_Controller_Mapping_Data* mappingData)
Paramètre | Description |
---|---|
addMode
|
Les règles d'ajout utilisées pour l'opération.
Les valeurs valides sont PADDLEBOAT_REMAP_ADD_MODE_DEFAULT ou PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL . |
remapTableEntryCount
|
La taille de tableau des éléments Paddleboat_Controller_Mapping_Data transmis au paramètre mappingData . |
mappingData
|
Un pointeur vers un tableau d'éléments Paddleboat_Controller_Mapping_Data . |
Modes d'ajout
Si PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL
est spécifié dans addMode
, la base de données existante est supprimée et remplacée par le contenu du nouveau tableau.
Si PADDLEBOAT_REMAP_ADD_MODE_DEFAULT
est spécifié dans addMode
, les critères suivants sont appliqués à chaque élément du tableau transmis dans mappingData
:
- Si une entrée
Paddleboat_getControllerRemapTableData
est unique (en d'autres termes, si levendorId
et leproductId
n'existent pas déjà ou existent, mais possèdent une plageminApi
oumaxApi
unique), l'entrée est ajoutée à la base de données interne. - Si l'entrée
Paddleboat_getControllerRemapTableData
n'est pas unique (vendorId
etproductId
existent et il y a un chevauchement deminApi
ou demaxApi
), l'entrée remplace l'entrée existante dans la base de données interne.
La structure de Paddleboat_Controller_Mapping_Data
est la suivante :
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;
Exemple de mappage
Voici une entrée Paddleboat_Controller_Mapping_Data
renseignée pour décrire une manette Google Stadia :
#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
}
};