تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
تحتفظ مكتبة Game Controller بقاعدة بيانات داخلية لأجهزة التحكّم، تُستخدَم في ضبط الأزرار وتصميم محور الحركة وعمليات الربط لأجهزة التحكّم المعروفة وعملية ربط تلقائية لأجهزة التحكّم غير المعروفة. تتضمّن قاعدة البيانات العديد من أدوات التحكّم الشائعة، ولكنها قد لا تتضمّن جميع الأجهزة ذات الصلة بلعبة معيّنة. تتيح مكتبة Game Controller إمكانية التخصيص
باستخدام دوال يمكنها تنفيذ ما يلي:
استرداد قاعدة بيانات الربط الحالية
إضافة إدخالات إلى قاعدة البيانات الحالية
استبدال إدخالات قاعدة البيانات الحالية
استبدال قاعدة البيانات الحالية بأكملها بقاعدة بيانات جديدة
تحديد جهاز
يتم تحديد أجهزة التحكّم من خلال قيمتَي productId وvendorId.
يحتوي كل جهاز تحكّم تم التعرّف عليه على إدخال واحد على الأقل في قاعدة البيانات يتضمّن productId وvendorId متطابقَين. يتضمّن هيكل ربط أزرار وحدة التحكّم حقولاً تحدّد الحد الأدنى والأقصى لنطاق واجهة برمجة التطبيقات المؤهّلة في Android للإدخال. قد تتوفّر إدخالات متعدّدة تتضمّن القيمتين productId وvendorId نفسيهما في قاعدة البيانات طالما أنّها تتضمّن نطاقات فريدة للحدّ الأدنى والأقصى في واجهة برمجة التطبيقات.
تعرض Paddleboat_getControllerRemapTableData إجمالي عدد إدخالات إعادة التعيين المتوفّرة في قاعدة البيانات الداخلية.
المَعلمة
الوصف
destRemapTableEntryCount
حجم مصفوفة
عناصر Paddleboat_Controller_Mapping_Data
التي تم تمريرها في المَعلمة mappingData.
mappingData
مؤشر إلى مصفوفة من عناصر Paddleboat_Controller_Mapping_Data
إذا كان destRemapTableEntryCount أصغر من إجمالي عدد إدخالات إعادة التعيين، سيتم نسخ عدد الإدخالات المحدّد بواسطة destRemapTableEntryCount فقط إلى mappingData.
قواعد الإضافة المستخدَمة في العملية
القيم الصالحة هي PADDLEBOAT_REMAP_ADD_MODE_DEFAULT أو PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL
remapTableEntryCount
حجم مصفوفة
عناصر Paddleboat_Controller_Mapping_Data
التي تم تمريرها في المَعلمة mappingData.
mappingData
مؤشر إلى مصفوفة من عناصر Paddleboat_Controller_Mapping_Data
أوضاع الإضافة
إذا تم تحديد PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL في addMode، سيتم حذف قاعدة البيانات الحالية واستبدالها بمحتويات المصفوفة الجديدة.
إذا تم تحديد PADDLEBOAT_REMAP_ADD_MODE_DEFAULT في addMode، سيتم تطبيق المعايير التالية على كل عنصر في المصفوفة التي تم تمريرها في mappingData:
إذا كان Paddleboat_getControllerRemapTableData فريدًا (بمعنى آخر، إذا لم يكن vendorId وproductId متوفّرَين من قبل، أو كانا متوفّرَين ولكن بنطاق minApi أو maxApi غير متداخل)، تتم إضافة الإدخال إلى قاعدة البيانات الداخلية.
إذا لم يكن Paddleboat_getControllerRemapTableData فريدًا (vendorId وproductId متوفّران وهناك تداخل في minApi أو maxApi)، سيتم استبدال الإدخال الحالي في قاعدة البيانات الداخلية.
تكون بنية Paddleboat_Controller_Mapping_Data على النحو التالي:
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;
#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}};
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-08-26 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-08-26 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],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 };"]]