게임 컨트롤러 라이브러리는 버튼, 모션 축 레이아웃, 인식된 컨트롤러에 대한 매핑, 인식되지 않은 컨트롤러에 대한 기본 매핑을 구성하는 데 사용되는 컨트롤러 기기의 내부 데이터베이스를 유지합니다. 이 데이터베이스에 널리 사용되는 여러 컨트롤러가 포함되어 있지만 모든 기기가 포함되어 있지는 않을 수 있음 표시할 수 있습니다. 게임 컨트롤러 라이브러리는 다음과 같은 기능을 갖춘 맞춤설정을 지원합니다.
- 현재 매핑 데이터베이스를 검색합니다.
- 기존 데이터베이스에 항목을 추가합니다.
- 기존 데이터베이스 항목을 바꿉니다.
- 현재 전체 데이터베이스를 새 데이터베이스로 교체합니다.
기기 식별
컨트롤러 기기는 productId
및 vendorId
값으로 식별됩니다.
인식된 각 컨트롤러 기기에는
일치하는 productId
및 vendorId
입니다. 컨트롤러 매핑 구조에는 항목의 적합한 최소 및 최대 Android 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
}
};