Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
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 base de données comprend de nombreuses manettes courantes, mais n'inclura peut-être pas tous les appareils pertinents pour un jeu en 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.
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.
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 le vendorId et le productId n'existent pas déjà ou existent, mais possèdent une plage minApi ou maxApi unique), l'entrée est ajoutée à la base de données interne.
Si l'entrée Paddleboat_getControllerRemapTableData n'est pas unique (vendorId et productId existent et il y a un chevauchement de minApi ou de maxApi), 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 :
typedefstructPaddleboat_Controller_Mapping_Data{int16_tminimumEffectiveApiLevel;/** Min. API level for this entry */int16_tmaximumEffectiveApiLevel;/** Max. API level, 0 = no max */int32_tvendorId;/** VendorID of the controller device for this entry */int32_tproductId;/** ProductID of the controller device for this entry */int32_tflags;/** 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_taxisMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];/** Button to set on positive or negative axis value, * PADDLEBOAT_AXIS_BUTTON_IGNORED if none. */uint8_taxisPositiveButtonMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];uint8_taxisNegativeButtonMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];/** AKEYCODE_ value corresponding with the corresponding Paddleboat button. * PADDLEBOAT_BUTTON_IGNORED if unsupported. */uint16_tbuttonMapping[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 12staticconstPaddleboat_Controller_Mapping_Datastadia_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}};
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/08/26 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/08/26 (UTC)."],[],[],null,["The Game Controller library maintains an internal database of controller\ndevices, which is used to configure buttons, motion axis layout, mapping for\nrecognized controllers, and a default mapping for unrecognized controllers. The\ndatabase includes many popular controllers, but might not include all devices\nrelevant to a particular game. The Game Controller library supports customization\nwith functions that can:\n\n- Retrieve the current mapping database.\n- Add entries to the existing database.\n- Replace existing database entries.\n- Replace the entire current database with a new one.\n\nIdentify a device\n\nController devices are identified by their `productId` and `vendorId` values.\nEach recognized controller device has at least one entry in the database with a\nmatching `productId` and `vendorId`. The controller mapping structure includes\nfields that specify a qualifying minimum and maximum Android API range for the\nentry. Multiple entries with the same `productId` and `vendorId` may exist in\nthe database as long as they have unique minimum and maximum API ranges.\n\nRead your current remap data\n\nUse the [`Paddleboat_getControllerRemapTableData`](/reference/games/game-controller/group/paddleboat#paddleboat_getcontrollerremaptabledata) function to\nretrieve the current remap data. \n\n int32_t Paddleboat_getControllerRemapTableData(\n const int32_t destRemapTableEntryCount,\n Paddleboat_Controller_Mapping_Data* mappingData)\n\n`Paddleboat_getControllerRemapTableData` returns the total number of remap\nentries present in the internal database.\n\n| Parameter | Description |\n|----------------------------|--------------------------------------------------------------------------------------------------------|\n| `destRemapTableEntryCount` | The array size of `Paddleboat_Controller_Mapping_Data` elements passed in the `mappingData` parameter. |\n| `mappingData` | A pointer to an array of `Paddleboat_Controller_Mapping_Data` elements. |\n\nIf `destRemapTableEntryCount` is smaller than the total number of remap entries,\nonly the number of entries specified by `destRemapTableEntryCount` are copied\ninto `mappingData`.\n\nAdd or replace remap data\n\nUse the [`Paddleboat_addControllerRemapData`](/reference/games/game-controller/group/paddleboat#paddleboat_addcontrollerremapdata) function to add\nremap entries, or replace the current remap database. \n\n void Paddleboat_addControllerRemapData(\n const Paddleboat_Remap_Addition_Mode addMode,\n const int32_t remapTableEntryCount,\n const Paddleboat_Controller_Mapping_Data* mappingData)\n\n| Parameter | Description |\n|------------------------|--------------------------------------------------------------------------------------------------------------------------------------------|\n| `addMode` | The addition rules used for the operation. Valid values are `PADDLEBOAT_REMAP_ADD_MODE_DEFAULT` or `PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL` |\n| `remapTableEntryCount` | The array size of `Paddleboat_Controller_Mapping_Data` elements passed in the `mappingData` parameter. |\n| `mappingData` | A pointer to an array of `Paddleboat_Controller_Mapping_Data` elements. |\n\nAddition modes\n\nIf `PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL` is specified in `addMode`, the\nexisting database is deleted and replaced by the contents of the new array.\n\nIf `PADDLEBOAT_REMAP_ADD_MODE_DEFAULT` is specified in `addMode`, the following\ncriteria are applied to each element in the array passed in `mappingData`:\n\n- If a `Paddleboat_getControllerRemapTableData` is unique (in other words, the `vendorId` and `productId` does not already exist, or does exist but has a non-overlapping `minApi` or `maxApi` range), the entry is added to the internal database.\n- If the `Paddleboat_getControllerRemapTableData` is not unique (`vendorId` and `productId` exists and there is a `minApi` or `maxApi` overlap), it *replaces* the existing entry in the internal database.\n\nThe `Paddleboat_Controller_Mapping_Data` structure is: \n\n typedef struct Paddleboat_Controller_Mapping_Data {\n int16_t minimumEffectiveApiLevel; /** Min. API level for this entry */\n int16_t maximumEffectiveApiLevel; /** Max. API level, 0 = no max */\n int32_t vendorId; /** VendorID of the controller device for this entry */\n int32_t productId; /** ProductID of the controller device for this entry */\n int32_t flags; /** Flag bits, will be ORed with\n * Paddleboat_Controller_Info.controllerFlags */\n\n /** AMOTION_EVENT_AXIS value for the corresponding Paddleboat control axis,\n * or PADDLEBOAT_AXIS_IGNORED if unsupported. */\n uint16_t axisMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];\n /** Button to set on positive or negative axis value,\n * PADDLEBOAT_AXIS_BUTTON_IGNORED if none. */\n uint8_t axisPositiveButtonMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];\n uint8_t axisNegativeButtonMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];\n /** AKEYCODE_ value corresponding with the corresponding Paddleboat button.\n * PADDLEBOAT_BUTTON_IGNORED if unsupported. */\n uint16_t buttonMapping[PADDLEBOAT_BUTTON_COUNT];\n } Paddleboat_Controller_Mapping_Data;\n\nMapping example\n\nThe following illustrates a `Paddleboat_Controller_Mapping_Data` populated to\ndescribe a [Google Stadia controller](https://store.google.com/product/stadia_controller): \n\n #define PADDLEBOAT_AXIS_BUTTON_DPAD_UP 0\n #define PADDLEBOAT_AXIS_BUTTON_DPAD_LEFT 1\n #define PADDLEBOAT_AXIS_BUTTON_DPAD_DOWN 2\n #define PADDLEBOAT_AXIS_BUTTON_DPAD_RIGHT 3\n #define PADDLEBOAT_AXIS_BUTTON_L2 9\n #define PADDLEBOAT_AXIS_BUTTON_R2 12\n\n static const Paddleboat_Controller_Mapping_Data stadia_controller_map[] = {\n 16, 0, 0x18d1, 0x9400, PADDLEBOAT_CONTROLLER_LAYOUT_STANDARD,\n {\n /* LX */ AMOTION_EVENT_AXIS_X,\n /* LY */ AMOTION_EVENT_AXIS_Y,\n /* RX */ AMOTION_EVENT_AXIS_Z,\n /* RY */ AMOTION_EVENT_AXIS_RZ,\n /* L1 */ PADDLEBOAT_AXIS_IGNORED,\n /* L2 */ AMOTION_EVENT_AXIS_BRAKE,\n /* R1 */ PADDLEBOAT_AXIS_IGNORED,\n /* R2 */ AMOTION_EVENT_AXIS_GAS,\n /* HX */ AMOTION_EVENT_AXIS_HAT_X,\n /* HY */ AMOTION_EVENT_AXIS_HAT_Y,\n },\n {\n /* LX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* LY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* RX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* RY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* L1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* L2 */ PADDLEBOAT_AXIS_BUTTON_L2,\n /* R1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* R2 */ PADDLEBOAT_AXIS_BUTTON_R2,\n /* HX */ PADDLEBOAT_AXIS_BUTTON_DPAD_RIGHT,\n /* HY */ PADDLEBOAT_AXIS_BUTTON_DPAD_DOWN,\n },\n {\n /* LX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* LY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* RX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* RY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* L1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* L2 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* R1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* R2 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,\n /* HX */ PADDLEBOAT_AXIS_BUTTON_DPAD_LEFT,\n /* HY */ PADDLEBOAT_AXIS_BUTTON_DPAD_UP,\n },\n {\n /* UP */ AKEYCODE_DPAD_UP,\n /* LEFT */ AKEYCODE_DPAD_LEFT,\n /* DOWN */ AKEYCODE_DPAD_DOWN,\n /* RIGHT */ AKEYCODE_DPAD_RIGHT,\n /* A */ AKEYCODE_BUTTON_A,\n /* B */ AKEYCODE_BUTTON_B,\n /* X */ AKEYCODE_BUTTON_X,\n /* Y */ AKEYCODE_BUTTON_Y,\n /* L1 */ AKEYCODE_BUTTON_L1,\n /* L2 */ AKEYCODE_BUTTON_L2,\n /* L3 */ AKEYCODE_BUTTON_THUMBL,\n /* R1 */ AKEYCODE_BUTTON_R1,\n /* R2 */ AKEYCODE_BUTTON_R2,\n /* R3 */ AKEYCODE_BUTTON_THUMBR,\n /* SELECT */ AKEYCODE_BUTTON_SELECT,\n /* START */ AKEYCODE_BUTTON_START,\n /* SYSTEM */ AKEYCODE_BUTTON_MODE,\n /* TOUCHP */ PADDLEBOAT_BUTTON_IGNORED,\n /* AUX1 */ PADDLEBOAT_BUTTON_IGNORED,\n /* AUX2 */ PADDLEBOAT_BUTTON_IGNORED,\n /* AUX3 */ PADDLEBOAT_BUTTON_IGNORED,\n /* AUX4 */ PADDLEBOAT_BUTTON_IGNORED\n }\n };"]]