הוספת מיפויים של מכשירים עם בקר בהתאמה אישית

ספריית בקרי המשחקים כוללת מסד נתונים פנימי של בקר מכשירים, שמשמשת להגדרת לחצנים, פריסה של צירי תנועה, מיפוי עבור בקרים מוכרים ומיפוי ברירת מחדל לבקרים לא מזוהים. מסד הנתונים כולל בקרים פופולריים רבים, אך עשוי שלא לכלול את כל המכשירים שרלוונטיות למשחק מסוים. הספרייה של בקר המשחקים תומכת בהתאמה אישית עם פונקציות שיכולות:

  • מאחזרים את מסד נתוני המיפוי הנוכחי.
  • מוסיפים את הרשומות למסד הנתונים הקיים.
  • החלפת הרשומות הקיימות במסד הנתונים.
  • מחליפים את כל מסד הנתונים הנוכחי במסד הנתונים החדש.

זיהוי מכשיר

מכשירים עם שלט רחוק מזוהים באמצעות הערכים 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 קטן מהמספר הכולל של הרשומות למיפוי מחדש, רק מספר הרשומות שצוין על ידי 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:

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