Menambahkan pemetaan perangkat pengontrol khusus

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. Database ini mencakup banyak pengontrol populer, tetapi mungkin tidak mencakup semua perangkat yang 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 productId dan vendorId yang cocok. 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 dapat ada di database selama keduanya 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 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 dan productId belum ada, atau memang ada, tetapi memiliki rentang minApi atau maxApi yang tidak tumpang-tindih), entri akan ditambahkan ke database internal.
  • Jika Paddleboat_getControllerRemapTableData tidak unik (vendorId dan productId ada dan minApi atau maxApi 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
    }
};