نگاشت های دستگاه کنترل کننده سفارشی را اضافه کنید

کتابخانه Game Controller یک پایگاه داده داخلی از دستگاه‌های کنترل‌کننده را نگهداری می‌کند که برای پیکربندی دکمه‌ها، طرح‌بندی محور حرکت، نقشه‌برداری برای کنترل‌کننده‌های شناخته‌شده، و یک نقشه پیش‌فرض برای کنترل‌کننده‌های ناشناس استفاده می‌شود. پایگاه داده شامل بسیاری از کنترلرهای محبوب است، اما ممکن است شامل همه دستگاه های مربوط به یک بازی خاص نباشد. کتابخانه Game Controller از سفارشی سازی با توابعی پشتیبانی می کند که می توانند:

  • پایگاه داده نقشه برداری فعلی را بازیابی کنید.
  • ورودی ها را به پایگاه داده موجود اضافه کنید.
  • ورودی های پایگاه داده موجود را جایگزین کنید.
  • کل پایگاه داده فعلی را با یک پایگاه داده جدید جایگزین کنید.

یک دستگاه را شناسایی کنید

دستگاه های کنترل کننده با مقادیر productId و vendorId آنها شناسایی می شوند. هر دستگاه کنترل کننده شناخته شده حداقل یک ورودی در پایگاه داده با productId و vendorId منطبق دارد. ساختار نگاشت کنترلر شامل فیلدهایی است که حداقل و حداکثر محدوده API Android واجد شرایط را برای ورودی مشخص می کند. چندین ورودی با productId و vendorId یکسان ممکن است در پایگاه داده وجود داشته باشند تا زمانی که دارای حداقل و حداکثر محدوده API منحصر به فرد باشند.

داده های remap فعلی خود را بخوانید

از تابع Paddleboat_getControllerRemapTableData برای بازیابی داده های remap فعلی استفاده کنید.

int32_t Paddleboat_getControllerRemapTableData(
   const int32_t destRemapTableEntryCount,
   Paddleboat_Controller_Mapping_Data* mappingData)

Paddleboat_getControllerRemapTableData تعداد کل ورودی های remap موجود در پایگاه داده داخلی را برمی گرداند.

پارامتر توضیحات
destRemapTableEntryCount اندازه آرایه عناصر Paddleboat_Controller_Mapping_Data در پارامتر mappingData ارسال شده است.
mappingData اشاره گر به آرایه ای از عناصر Paddleboat_Controller_Mapping_Data .

اگر destRemapTableEntryCount کوچکتر از تعداد کل ورودی های remap باشد، فقط تعداد ورودی های مشخص شده توسط destRemapTableEntryCount در mappingData کپی می شود.

داده های remap را اضافه یا جایگزین کنید

از تابع Paddleboat_addControllerRemapData برای افزودن ورودی های remap یا جایگزینی پایگاه داده remap فعلی استفاده کنید.

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