কাস্টম কন্ট্রোলার ডিভাইস ম্যাপিং যোগ করুন

গেম কন্ট্রোলার লাইব্রেরি কন্ট্রোলার ডিভাইসগুলির একটি অভ্যন্তরীণ ডাটাবেস রক্ষণাবেক্ষণ করে, যা বোতাম, গতি অক্ষ বিন্যাস, স্বীকৃত কন্ট্রোলারের জন্য ম্যাপিং এবং অচেনা কন্ট্রোলারের জন্য একটি ডিফল্ট ম্যাপিং কনফিগার করতে ব্যবহৃত হয়। ডাটাবেসে অনেক জনপ্রিয় কন্ট্রোলার রয়েছে, তবে একটি নির্দিষ্ট গেমের সাথে প্রাসঙ্গিক সমস্ত ডিভাইস অন্তর্ভুক্ত নাও হতে পারে। গেম কন্ট্রোলার লাইব্রেরি এমন ফাংশনগুলির সাথে কাস্টমাইজেশন সমর্থন করে যা করতে পারে:

  • বর্তমান ম্যাপিং ডাটাবেস পুনরুদ্ধার করুন।
  • বিদ্যমান ডাটাবেসে এন্ট্রি যোগ করুন।
  • বিদ্যমান ডাটাবেস এন্ট্রি প্রতিস্থাপন.
  • পুরো বর্তমান ডাটাবেসটিকে একটি নতুন দিয়ে প্রতিস্থাপন করুন।

একটি ডিভাইস সনাক্ত করুন

কন্ট্রোলার ডিভাইসগুলি তাদের 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 উপাদানগুলির একটি অ্যারের একটি পয়েন্টার।

সংযোজন মোড

যদি addModePADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL নির্দিষ্ট করা থাকে, তাহলে বিদ্যমান ডাটাবেস মুছে ফেলা হয় এবং নতুন অ্যারের বিষয়বস্তু দ্বারা প্রতিস্থাপিত হয়।

যদি addMode PADDLEBOAT_REMAP_ADD_MODE_DEFAULT নির্দিষ্ট করা থাকে, তাহলে 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;

ম্যাপিং উদাহরণ

Google Stadia কন্ট্রোলার বর্ণনা করার জন্য নিম্নলিখিত একটি Paddleboat_Controller_Mapping_Data চিত্রিত করে:

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