เพิ่มการแมปอุปกรณ์ตัวควบคุมที่กำหนดเอง

ไลบรารีเกมคอนโทรลเลอร์จะดูแลรักษาฐานข้อมูลภายในของตัวควบคุม อุปกรณ์ ซึ่งใช้เพื่อกำหนดค่าปุ่ม เลย์เอาต์แกนการเคลื่อนไหว การแมป ตัวควบคุมที่รู้จัก และการแมปเริ่มต้นสำหรับตัวควบคุมที่ไม่รู้จัก ฐานข้อมูลมีตัวควบคุมยอดนิยมหลายรายการ แต่อาจไม่รวมอุปกรณ์ทั้งหมด ที่เกี่ยวข้องกับเกมใดเกมหนึ่ง ไลบรารีเกมคอนโทรลเลอร์สนับสนุนการปรับแต่ง พร้อมด้วยฟังก์ชันที่ช่วยทำสิ่งต่อไปนี้ได้

  • เรียกดูฐานข้อมูลการจับคู่ปัจจุบัน
  • เพิ่มรายการลงในฐานข้อมูลที่มีอยู่
  • แทนที่รายการฐานข้อมูลที่มีอยู่
  • แทนที่ฐานข้อมูลปัจจุบันทั้งหมดด้วยฐานข้อมูลใหม่

ระบุอุปกรณ์

อุปกรณ์ตัวควบคุมจะระบุด้วยค่า productId และ vendorId อุปกรณ์ตัวควบคุมที่รู้จักแต่ละเครื่องมีข้อมูลอย่างน้อย 1 รายการในฐานข้อมูล การจับคู่ productId กับ vendorId โครงสร้างการแมปตัวควบคุมประกอบด้วย ที่ระบุช่วง 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 น้อยกว่าจำนวนรายการรีแมปทั้งหมด ระบบจะคัดลอกเฉพาะจำนวนรายการที่ระบุโดย 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 ขนาดอาร์เรย์ของ องค์ประกอบ Paddleboat_Controller_Mapping_Data ส่งในพารามิเตอร์ mappingData
mappingData ตัวชี้ไปยังอาร์เรย์ของ องค์ประกอบ Paddleboat_Controller_Mapping_Data

โหมดการเพิ่ม

หากระบุ PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL ใน addMode ค่า ฐานข้อมูลที่มีอยู่จะถูกลบและแทนที่ด้วยเนื้อหาของอาร์เรย์ใหม่

หากระบุ 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 Controller:

#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
    }
};