游戏控制器库维护一个内部控制器设备数据库,用于配置按钮、运动轴布局、已识别控制器的映射以及未识别控制器的默认映射。该数据库包含许多流行的控制器,但可能不包含与特定游戏相关的所有设备。游戏控制器库支持使用可以执行以下操作的功能进行自定义:
- 检索当前映射数据库。
- 向现有数据库添加条目。
- 替换现有数据库条目。
- 用新的数据库替换整个当前数据库。
识别设备
控制器设备通过其 productId
和 vendorId
值进行识别。每个已识别的控制器设备在数据库中至少有一个具有匹配 productId
和 vendorId
的条目。控制器映射结构包含指定条目的合格最小和最大 Android API 范围的字段。只要具有唯一的最小和最大 API 范围,数据库中可能存在多个具有相同 productId
和 vendorId
的条目。
读取您当前的重新映射数据
使用 Paddleboat_getControllerRemapTableData
函数检索当前的重新映射数据。
int32_t Paddleboat_getControllerRemapTableData(
const int32_t destRemapTableEntryCount,
Paddleboat_Controller_Mapping_Data* mappingData)
Paddleboat_getControllerRemapTableData
返回内部数据库中存在的重新映射条目的总数。
参数 | 描述 |
---|---|
destRemapTableEntryCount
|
在 mappingData 参数中传递的 Paddleboat_Controller_Mapping_Data 元素的数组大小。 |
mappingData
|
指向 Paddleboat_Controller_Mapping_Data 元素数组的指针。 |
如果 destRemapTableEntryCount
小于重新映射条目的总数,则仅将 destRemapTableEntryCount
指定的条目数复制到 mappingData
中。
添加或替换重新映射数据
使用 Paddleboat_addControllerRemapData
函数添加重新映射条目或替换当前重新映射数据库。
void Paddleboat_addControllerRemapData(
const Paddleboat_Remap_Addition_Mode addMode,
const int32_t remapTableEntryCount,
const Paddleboat_Controller_Mapping_Data* mappingData)
参数 | 描述 |
---|---|
addMode
|
用于操作的添加规则。有效值为 PADDLEBOAT_REMAP_ADD_MODE_DEFAULT 或 PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL |
remapTableEntryCount
|
在 mappingData 参数中传递的 Paddleboat_Controller_Mapping_Data 元素的数组大小。 |
mappingData
|
指向 Paddleboat_Controller_Mapping_Data 元素数组的指针。 |
添加模式
如果在 addMode
中指定了 PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL
,则现有数据库将被删除并替换为新数组的内容。
如果在 addMode
中指定了 PADDLEBOAT_REMAP_ADD_MODE_DEFAULT
,则以下标准将应用于在 mappingData
中传递的数组中的每个元素
- 如果
Paddleboat_getControllerRemapTableData
是唯一的(换句话说,vendorId
和productId
不存在,或者存在但具有不重叠的minApi
或maxApi
范围),则该条目将添加到内部数据库中。 - 如果
Paddleboat_getControllerRemapTableData
不是唯一的(vendorId
和productId
存在并且存在minApi
或maxApi
重叠),则它会替换内部数据库中的现有条目。
Paddleboat_Controller_Mapping_Data
结构为
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;
映射示例
以下内容说明了一个填充以描述 Google Stadia 控制器 的 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 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
}
};