Библиотека игровых контроллеров поддерживает внутреннюю базу данных устройств контроллеров, которая используется для настройки кнопок, расположения осей движения, сопоставления распознанных контроллеров и сопоставления по умолчанию для нераспознанных контроллеров. База данных включает в себя множество популярных контроллеров, но может не включать все устройства, относящиеся к конкретной игре. Библиотека игрового контроллера поддерживает настройку с помощью функций, которые могут:
- Получить текущую базу данных картографии.
- Добавляйте записи в существующую базу данных.
- Замените существующие записи базы данных.
- Замените всю текущую базу данных новой.
Определить устройство
Устройства контроллера идентифицируются по значениям productId
и vendorId
. Каждое распознанное устройство-контроллер имеет по крайней мере одну запись в базе данных с совпадающими productId
и vendorId
. Структура сопоставления контроллера включает поля, которые указывают минимальный и максимальный диапазон Android API для записи. В базе данных могут существовать несколько записей с одним и тем же productId
и vendorId
, если они имеют уникальные минимальный и максимальный диапазоны API.
Прочитайте текущие данные переназначения
Используйте функцию Paddleboat_getControllerRemapTableData
чтобы получить текущие данные переназначения.
int32_t Paddleboat_getControllerRemapTableData(
const int32_t destRemapTableEntryCount,
Paddleboat_Controller_Mapping_Data* mappingData)
Paddleboat_getControllerRemapTableData
возвращает общее количество записей переназначения, присутствующих во внутренней базе данных.
Параметр | Описание |
---|---|
destRemapTableEntryCount | Размер массива элементов Paddleboat_Controller_Mapping_Data , передаваемых в параметре mappingData . |
mappingData | Указатель на массив элементов Paddleboat_Controller_Mapping_Data . |
Если destRemapTableEntryCount
меньше общего количества записей перераспределения, в mappingData
копируется только количество записей, указанное в destRemapTableEntryCount
.
Добавить или заменить данные переназначения
Используйте функцию 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 | Размер массива элементов Paddleboat_Controller_Mapping_Data , передаваемых в параметре mappingData . |
mappingData | Указатель на массив элементов Paddleboat_Controller_Mapping_Data . |
Режимы сложения
Если в addMode
указано PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL
, существующая база данных удаляется и заменяется содержимым нового массива.
Если PADDLEBOAT_REMAP_ADD_MODE_DEFAULT
указан в addMode
, следующие критерии применяются к каждому элементу массива, переданному в 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;
Пример сопоставления
Ниже показано значение Paddleboat_Controller_Mapping_Data
, заполненное для описания контроллера 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
}
};