Library Pengontrol Game mempertahankan basis data internal perangkat pengontrol yang digunakan untuk mengonfigurasi tombol, tata letak sumbu gerak, pemetaan untuk pengontrol yang dikenali, dan pemetaan default untuk pengontrol yang tidak dikenal. Tujuan database mencakup banyak pengontrol populer, tetapi mungkin tidak mencakup semua perangkat relevan dengan game tertentu. Library Pengontrol Game mendukung penyesuaian dengan fungsi yang dapat:
- Mengambil database pemetaan saat ini.
- Menambahkan entri ke database yang ada.
- Mengganti entri database yang ada.
- Mengganti seluruh database saat ini dengan database baru.
Mengidentifikasi perangkat
Perangkat pengontrol diidentifikasi melalui nilai productId
dan vendorId
miliknya.
Setiap perangkat pengontrol yang dikenali memiliki setidaknya satu entri dalam database dengan
cocok dengan productId
dan vendorId
. Struktur pemetaan pengontrol mencakup
kolom yang menentukan rentang minimum dan maksimum API Android yang memenuhi syarat
entri tersebut. Beberapa entri dengan productId
dan vendorId
yang sama mungkin ada di
database selama memiliki rentang API minimum dan maksimum yang unik.
Membaca data pemetaan ulang saat ini
Gunakan fungsi Paddleboat_getControllerRemapTableData
untuk
mengambil data pemetaan ulang saat ini.
int32_t Paddleboat_getControllerRemapTableData(
const int32_t destRemapTableEntryCount,
Paddleboat_Controller_Mapping_Data* mappingData)
Paddleboat_getControllerRemapTableData
menampilkan jumlah total entri pemetaan ulang
yang ada di database internal.
Parameter | Deskripsi |
---|---|
destRemapTableEntryCount
|
Ukuran array elemen Paddleboat_Controller_Mapping_Data
yang diteruskan
di parameter mappingData . |
mappingData
|
Pointer ke array
elemen Paddleboat_Controller_Mapping_Data . |
Jika destRemapTableEntryCount
lebih kecil dari jumlah total entri pemetaan ulang,
hanya jumlah entri yang ditentukan oleh destRemapTableEntryCount
yang disalin
ke dalam mappingData
.
Menambahkan atau mengganti data pemetaan ulang
Gunakan fungsi Paddleboat_addControllerRemapData
untuk menambahkan
entri pemetaan ulang, atau mengganti database pemetaan ulang saat ini.
void Paddleboat_addControllerRemapData(
const Paddleboat_Remap_Addition_Mode addMode,
const int32_t remapTableEntryCount,
const Paddleboat_Controller_Mapping_Data* mappingData)
Parameter | Deskripsi |
---|---|
addMode
|
Aturan tambahan yang digunakan untuk operasi.
Nilai yang valid adalah
PADDLEBOAT_REMAP_ADD_MODE_DEFAULT atau
PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL |
remapTableEntryCount
|
Ukuran array elemen Paddleboat_Controller_Mapping_Data
yang diteruskan
di parameter mappingData . |
mappingData
|
Pointer ke array
elemen Paddleboat_Controller_Mapping_Data . |
Mode tambahan
Jika PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL
ditentukan dalam addMode
,
database yang ada akan dihapus dan diganti dengan konten array baru.
Jika PADDLEBOAT_REMAP_ADD_MODE_DEFAULT
ditentukan dalam addMode
, kriteria
berikut akan diterapkan ke setiap elemen dalam array yang diteruskan dalam mappingData
:
- Jika
Paddleboat_getControllerRemapTableData
bersifat unik (dengan kata lain,vendorId
danproductId
belum ada, atau memang ada, tetapi memiliki rentangminApi
ataumaxApi
yang tidak tumpang-tindih), entri akan ditambahkan ke database internal. - Jika
Paddleboat_getControllerRemapTableData
tidak unik (vendorId
danproductId
ada danminApi
ataumaxApi
tumpang-tindih), entri yang ada dalam database internal akan diganti.
Struktur Paddleboat_Controller_Mapping_Data
adalah:
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;
Contoh pemetaan
Kode berikut mengilustrasikan Paddleboat_Controller_Mapping_Data
yang diisi untuk
menjelaskan pengontrol 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
}
};