গেম কন্ট্রোলার লাইব্রেরি ব্যবহার করুন

গেম কন্ট্রোলার লাইব্রেরি ব্যবহার করে আপনার গেমে গেম কন্ট্রোলার সমর্থন যোগ করতে নিম্নলিখিত ফাংশনগুলি ব্যবহার করুন।

গেম কন্ট্রোলার লাইব্রেরি শুরু এবং ধ্বংস করুন

গেম কন্ট্রোলার লাইব্রেরি আরম্ভ করতে Paddleboat_init ফাংশন ব্যবহার করুন।

Paddleboat_ErrorCode Paddleboat_init(JNIEnv *env, jobject jcontext)

Paddleboat_init দুটি প্যারামিটার লাগে:

  • বর্তমান থ্রেডের সাথে সংযুক্ত একটি JNIEnv এর একটি পয়েন্টার৷
  • একটি Context প্রাপ্ত ক্লাসের একটি jobject JNI অবজেক্ট রেফারেন্স। যেকোন Context প্রাপ্ত ক্লাস অবজেক্ট বৈধ, যার মধ্যে রয়েছে কিন্তু সীমাবদ্ধ নয় Activity , NativeActivity , বা GameActivity

Paddleboat_init PADDLEBOAT_NO_ERROR প্রদান করে যদি আরম্ভ সফল হয়, অন্যথায় একটি উপযুক্ত ত্রুটি কোড ফেরত দেওয়া হয়।

গেম কন্ট্রোলার লাইব্রেরি সফলভাবে আরম্ভ করা হয়েছে কিনা তা পরীক্ষা করতে আপনি Paddleboat_isInitialized ব্যবহার করতে পারেন। এটি একটি বুলিয়ান মান প্রদান করে। সত্য হলে, API ব্যবহারের জন্য উপলব্ধ।

bool Paddleboat_isInitialized()

অ্যাপ্লিকেশনটি বন্ধ করার আগে, গেম কন্ট্রোলার লাইব্রেরি বন্ধ করতে Paddleboat_destroy ফাংশনটি ব্যবহার করুন। ফাংশনটি একটি একক প্যারামিটার নেয়, বর্তমান থ্রেডের সাথে সংযুক্ত একটি JNIEnv এর একটি পয়েন্টার। Paddleboat_init আবার Paddleboat_destroy এর পরে কল করা যেতে পারে।

void Paddleboat_destroy(JNIEnv *env)

জীবনচক্র ইভেন্টগুলির লাইব্রেরীকে অবহিত করুন

গেম কন্ট্রোলার লাইব্রেরীকে অবশ্যই onStop এবং onStart ইভেন্টের কার্যকলাপের জীবনচক্র সম্পর্কে অবহিত করতে হবে। আপনার স্টপ থেকে Paddleboat_onStop এবং Paddleboat_onStart ফাংশনগুলিতে কল করুন এবং ইভেন্ট হ্যান্ডলিং কোড শুরু করুন। উভয় ফাংশন একটি একক প্যারামিটার নেয়: বর্তমান থ্রেডের সাথে সংযুক্ত একটি JNIEnv এর একটি পয়েন্টার।

void Paddleboat_onStop(JNIEnv *env)
void Paddleboat_onStart(JNIEnv *env)

একটি নিয়ামক স্থিতি কলব্যাক নিবন্ধন করুন বা সরান৷

গেম কন্ট্রোলার লাইব্রেরি একটি কন্ট্রোলার স্ট্যাটাস কলব্যাক ব্যবহার করে যখন একটি কন্ট্রোলার সংযুক্ত বা সংযোগ বিচ্ছিন্ন হয় তখন একটি গেমকে অবহিত করতে। এটি একটি সময়ে শুধুমাত্র একটি কন্ট্রোলার স্ট্যাটাস কলব্যাক সমর্থন করে।

  • একটি কন্ট্রোলার স্ট্যাটাস কলব্যাক নিবন্ধন করতে বা একটি নতুন কলব্যাক ফাংশন দিয়ে পূর্বে নিবন্ধিত কলব্যাক প্রতিস্থাপন করতে, Paddleboat_setControllerStatusCallback ফাংশনটি কল করুন।
  • বর্তমানে নিবন্ধিত কলব্যাক অপসারণ করতে, NULL বা nullptr পাস করুন।
  • userData প্যারামিটার হল ব্যবহারকারীর সংজ্ঞায়িত ডেটার একটি ঐচ্ছিক পয়েন্টার। userData প্যারামিটারটি কলব্যাক ফাংশনে পাঠানো হবে। Paddleboat_setControllerStatusCallback এ পরবর্তী কল দ্বারা পরিবর্তিত না হওয়া পর্যন্ত এই পয়েন্টারটি অভ্যন্তরীণভাবে ধরে রাখা হয়।
void Paddleboat_setControllerStatusCallback(Paddleboat_ControllerStatusCallback
  statusCallback, void *userData)

কলব্যাক ফাংশনের ফাংশন স্বাক্ষর হল:

typedef void (*Paddleboat_ControllerStatusCallback)(
  const int32_t controllerIndex,
  const Paddleboat_ControllerStatus controllerStatus,
  void *userData)
প্যারামিটার বর্ণনা
controllerIndex কলব্যাক শুরু করা নিয়ামকের সূচক। 0 এবং এর মধ্যে একটি মান হবে
PADDLEBOAT_MAX_CONTROLLERS - 1
controllerStatus PADDLEBOAT_CONTROLLER_JUST_CONNECTED এর এনাম মান বা
PADDLEBOAT_CONTROLLER_JUST_DISCONNECTED
userData Paddleboat_setControllerStatusCallback কে শেষ কল দ্বারা নির্দিষ্ট করা ব্যবহারকারীর সংজ্ঞায়িত ডেটার জন্য একটি ঐচ্ছিক পয়েন্টার (নূল হতে পারে)।

গেম কন্ট্রোলার লাইব্রেরি আপডেট ফাংশন কল করুন

গেম কন্ট্রোলার লাইব্রেরি আপডেট ফাংশন, Paddleboat_update , প্রতি গেম ফ্রেমে একবার কল করা উচিত, বিশেষত ফ্রেমের শুরুর কাছাকাছি। ফাংশনটি একটি একক প্যারামিটার নেয়, বর্তমান থ্রেডের সাথে সংযুক্ত একটি JNIEnv এর একটি পয়েন্টার।

void Paddleboat_update(JNIEnv *env)

প্রক্রিয়া ইভেন্ট

ইনপুট ইভেন্টগুলি গ্রহণ করার সময়, আপনার গেমটিকে পরিদর্শনের জন্য গেম কন্ট্রোলার লাইব্রেরিতে পাঠাতে হবে। গেম কন্ট্রোলার লাইব্রেরি মূল্যায়ন করে যদি একটি ইনপুট ইভেন্ট তার পরিচালিত ডিভাইসগুলির সাথে যুক্ত থাকে। পরিচালিত ডিভাইস থেকে ইভেন্টগুলি প্রক্রিয়া করা হয় এবং সেবন করা হয়।

গেম কন্ট্রোলার লাইব্রেরি দুই ধরনের ইনপুট ইভেন্ট সমর্থন করে: AInputEvents এবং GameActivity ইনপুট ইভেন্ট।

AInputEvent প্রক্রিয়াকরণ

আপনার গেমটি আপনার ইভেন্ট হ্যান্ডলিং কোড থেকে Paddleboat_processInputEvent কল করে AInputEvents ফরোয়ার্ড করা উচিত।

int32_t Paddleboat_processInputEvent(const AInputEvent *event)

Paddleboat_processInputEvent 0 ফেরত দেবে যদি ইভেন্টটি উপেক্ষা করা হয় এবং 1 যদি ইভেন্টটি গেম কন্ট্রোলার লাইব্রেরি দ্বারা প্রক্রিয়া করা হয় এবং সেবন করা হয়।

গেম অ্যাক্টিভিটি ইভেন্ট প্রক্রিয়াকরণ

আপনার গেম যদি GameActivity ব্যবহার করে, তাহলে আপনার ইভেন্ট হ্যান্ডলিং কোড থেকে Paddleboat_processGameActivityKeyInputEvent বা Paddleboat_processGameActivityMotionInputEvent কল করে GameActivityKeyEvent এবং GameActivityMotionEvent ইভেন্ট ফরওয়ার্ড করুন।

int32_t Paddleboat_processGameActivityKeyInputEvent(const void *event,
                                                    const size_t eventSize)
int32_t Paddleboat_processGameActivityMotionInputEvent(const void *event,
                                                       const size_t eventSize)
প্যারামিটার বর্ণনা
event কোন ফাংশন কল করা হচ্ছে তার উপর নির্ভর করে একটি GameActivityKeyEvent বা GameActivityMotionEvent কাঠামোর একটি পয়েন্টার।
eventSize event প্যারামিটারে পাস করা ইভেন্ট স্ট্রাকচারের বাইটের আকার।

উভয় ফাংশন 0 প্রদান করবে যদি ইভেন্টটি উপেক্ষা করা হয় এবং 1 যদি ইভেন্টটি গেম কন্ট্রোলার লাইব্রেরি দ্বারা প্রক্রিয়া করা হয় এবং সেবন করা হয়।

GameActivity জন্য GameActivityPointerAxes_enableAxis ফাংশন ব্যবহার করে সক্রিয় গতির অক্ষ নির্দিষ্ট করা প্রয়োজন। Paddleboat_getActiveAxisMask কলটি সংযুক্ত কন্ট্রোলার দ্বারা ব্যবহৃত বর্তমানে সক্রিয় গতি অক্ষের একটি বিটমাস্ক প্রদান করে।

uint64_t Paddleboat_getActiveAxisMask()

এটি কীভাবে পরিচালনা করবেন তার একটি উদাহরণের জন্য, গেম কন্ট্রোলার লাইব্রেরির নমুনা দেখুন যা GameActivity ব্যবহার করে। নমুনা সক্রিয় অক্ষ মুখোশ পোল করে এবং যখন নতুন অক্ষ ব্যবহার করা হয় তখন GameActivity জানায়। এটি NativeEngine::CheckForNewAxis() ফাংশনে প্রয়োগ করা হয়।

void NativeEngine::CheckForNewAxis() {
    // Tell GameActivity about any new axis ids so it reports
    // their events
    const uint64_t activeAxisIds = Paddleboat_getActiveAxisMask();
    uint64_t newAxisIds = activeAxisIds ^ mActiveAxisIds;
    if (newAxisIds != 0) {
        mActiveAxisIds = activeAxisIds;
        int32_t currentAxisId = 0;
        while(newAxisIds != 0) {
            if ((newAxisIds & 1) != 0) {
                LOGD("Enable Axis: %d", currentAxisId);
                GameActivityPointerAxes_enableAxis(currentAxisId);
            }
            ++currentAxisId;
            newAxisIds >>= 1;
        }
    }
}

কন্ট্রোলার পড়ুন

গেম কন্ট্রোলার লাইব্রেরি একটি নির্দিষ্ট নিয়ামককে উল্লেখ করতে একটি সূচক মান ব্যবহার করে। বৈধ সূচক মান 0 থেকে PADDLEBOAT_MAX_CONTROLLERS - 1 পর্যন্ত। Paddleboat_getControllerStatus ফাংশন একটি নির্দিষ্ট নিয়ামক সূচকের অবস্থা নির্ধারণ করে।

Paddleboat_ControllerStatus Paddleboat_getControllerStatus(
  const int32_t controllerIndex)

একটি সংযুক্ত নিয়ামক থেকে তথ্য পড়ার জন্য তিনটি ফাংশন আছে।

  • Paddleboat_getControllerName ফাংশন কন্ট্রোলার ডিভাইসের নাম পুনরুদ্ধার করে।
  • Paddleboat_getControllerInfo ফাংশন কন্ট্রোলার ডিভাইস সম্পর্কে ডেটা পুনরুদ্ধার করে।
  • Paddleboat_getControllerData ফাংশন কন্ট্রোলার ইনপুটগুলির বর্তমান অবস্থা পুনরুদ্ধার করে।

নিয়ন্ত্রকের নাম

Paddleboat_getControllerName function দুটি ইনপুট পরামিতি নেয়: একটি কন্ট্রোলার সূচক, একটি বাফার আকার, এবং কন্ট্রোলার নামের স্ট্রিং সংরক্ষণ করতে একটি বাফারে একটি পয়েন্টার। নামের স্ট্রিংটি UTF-8 এনকোডিং ব্যবহার করে একটি C স্ট্রিং হিসাবে ফর্ম্যাট করা হয়েছে। InputDevice.getName() ব্যবহার করে ডিভাইসের নাম অভ্যন্তরীণভাবে পাওয়া যায়।

যদি Paddleboat_getControllerName সফলভাবে নামটি পুনরুদ্ধার করে, এটি PADDLEBOAT_NO_ERROR ফেরত দেয়, অন্যথায় একটি উপযুক্ত ত্রুটি কোড ফেরত দেওয়া হয়।

Paddleboat_ErrorCode Paddleboat_getControllerName(const int32_t controllerIndex,
                                                  const size_t bufferSize,
                                                  char *controllerName);
প্যারামিটার বর্ণনা
controllerIndex কলব্যাক শুরু করা নিয়ামকের সূচক। 0 এবং এর মধ্যে একটি মান হবে
PADDLEBOAT_MAX_CONTROLLERS - 1
bufferSize controllerName দ্বারা পাস করা বাফারের বাইটের আকার, নাম স্ট্রিং হবে। বাফারে ফিট করার জন্য প্রয়োজন হলে কেটে ফেলা হয়।
controllerName কন্ট্রোলারের নাম সংরক্ষণ করার জন্য bufferSize বাইটের একটি বাফারে একটি পয়েন্টার। নামটি UTF-8 এনকোডিং ব্যবহার করে একটি C স্ট্রিং হিসাবে সংরক্ষণ করা হবে।

কন্ট্রোলার ডিভাইস তথ্য

Paddleboat_getControllerInfo function দুটি ইনপুট পরামিতি নেয়: একটি নিয়ামক সূচক এবং একটি Paddleboat_Controller_Info কাঠামোর একটি পয়েন্টার।

যদি Paddleboat_Controller_Info সফলভাবে ডেটা দিয়ে পূর্ণ হয়, Paddleboat_getControllerInfo PADDLEBOAT_NO_ERROR প্রদান করে, অন্যথায় একটি উপযুক্ত ত্রুটি কোড ফেরত দেওয়া হয়।

Paddleboat_ErrorCode Paddleboat_getControllerInfo(const int32_t controllerIndex,
  Paddleboat_Controller_Info *controllerInfo)

Paddleboat_Controller_Info কাঠামোতে নিয়ামক সম্পর্কে ডিভাইস-নির্দিষ্ট তথ্য রয়েছে।

typedef struct Paddleboat_Controller_Info {
    uint32_t controllerFlags;
    int32_t controllerNumber;
    int32_t vendorId;
    int32_t productId;
    int32_t deviceId;
    Paddleboat_Controller_Thumbstick_Precision leftStickPrecision;
    Paddleboat_Controller_Thumbstick_Precision rightStickPrecision;
} Paddleboat_Controller_Info;

typedef struct Paddleboat_Controller_Thumbstick_Precision {
    float stickFlatX;
    float stickFlatY;
    float stickFuzzX;
    float stickFuzzY;
} Paddleboat_Controller_Thumbstick_Precision;

কন্ট্রোলারের সাথে যুক্ত InputDevice থেকে নেওয়া মান দ্বারা বেশ কিছু স্ট্রাকট সদস্য জনবহুল হয়:

controllerNumber    -   InputDevice.getControllerNumber()
vendorId              - InputDevice.getVendorId()
productId             - InputDevice.getProductId()
deviceId              - InputDevice.getId()
  • একটি stickFlat মান একটি কেন্দ্র সমতল অবস্থানের ব্যাপ্তি উপস্থাপন করে। এই মানটি মূলত স্ব-কেন্দ্রিক ডিভাইসে একটি ডিফল্ট কেন্দ্র 'ডেড-জোন' গণনার জন্য উপযোগী।
  • একটি stickFuzz মান ত্রুটি সহনশীলতার প্রতিনিধিত্ব করে, বা শব্দ এবং ডিভাইসের সংবেদনশীলতার সীমাবদ্ধতার কারণে বর্তমান মান প্রকৃত মান থেকে কতদূর বিচ্যুত হতে পারে।

উভয় মান উভয় মাত্রার সর্বোচ্চ 1.0 অক্ষ মান স্বাভাবিক করা হয়।

controllerFlags সদস্যে পৃথক বিটমাস্কযুক্ত পতাকা এবং একাধিক-বিট সমন্বয় মানগুলির সংমিশ্রণ রয়েছে।

PADDLEBOAT_CONTROLLER_LAYOUT_MASK এর সাথে একটি লজিক্যাল AND controllerFlags সম্পাদন করার ফলে একটি মান পাওয়া যায় যা Paddleboat_ControllerButtonLayout enum এ কাস্ট করা যেতে পারে। এই enum কন্ট্রোলার দ্বারা ব্যবহৃত বোতাম আইকনোগ্রাফি এবং বিন্যাস নির্দিষ্ট করে।

enum Paddleboat_ControllerButtonLayout {
    //  Y
    // X B
    //  A
    PADDLEBOAT_CONTROLLER_LAYOUT_STANDARD = 0,
    //  △
    // □ ○
    //  x
    PADDLEBOAT_CONTROLLER_LAYOUT_SHAPES = 1,
    //  X
    // Y A
    //  B
    PADDLEBOAT_CONTROLLER_LAYOUT_REVERSE = 2,
    // X Y R1 L1
    // A B R2 L2
    PADDLEBOAT_CONTROLLER_LAYOUT_ARCADE_STICK = 3,
    PADDLEBOAT_CONTROLLER_LAYOUT_MASK = 3
};

নিম্নলিখিত ধ্রুবকগুলি ক্ষমতা বিটগুলিকে সংজ্ঞায়িত করে। একটি নিয়ামক একটি নির্দিষ্ট ক্ষমতা সমর্থন করে কিনা তা নির্ধারণ করতে, controllerFlags বিপরীতে সংশ্লিষ্ট ধ্রুবকের একটি যৌক্তিক AND সম্পাদন করুন। একটি অ-শূন্য ফলাফল মানে ক্ষমতা নিয়ামক দ্বারা সমর্থিত হয়.

PADDLEBOAT_CONTROLLER_FLAG_TOUCHPAD

যদি এই পতাকা বিট সেট করা থাকে, তাহলে কন্ট্রোলারের একটি সমন্বিত টাচপ্যাড থাকে। যদি টাচপ্যাড চাপা হয়, তাহলে কন্ট্রোলার Paddleboat_Controller_Data.buttonsDown ফিল্ডে PADDLEBOAT_BUTTON_TOUCHPAD বিট সেট করে।

PADDLEBOAT_CONTROLLER_FLAG_VIRTUAL_MOUSE

যদি এই পতাকা বিট সেট করা থাকে, তাহলে কন্ট্রোলার একটি পয়েন্টার ডিভাইস অনুকরণ করে। Paddleboat_Controller_Data কাঠামোর virtualPointer সদস্য ভার্চুয়াল পয়েন্টারের বর্তমান স্থানাঙ্কের সাথে পপুলেট করা হয়।

কন্ট্রোলার ডেটা

Paddleboat_getControllerData ফাংশন দুটি ইনপুট প্যারামিটার নেয়: একটি নিয়ামক সূচক এবং একটি Paddleboat_Controller_Data কাঠামোর একটি পয়েন্টার। যদি Paddleboat_Controller_Data সফলভাবে ডেটা দিয়ে পূরণ করা হয়, Paddleboat_getControllerInfo PADDLEBOAT_NO_ERROR প্রদান করে, অন্যথায় একটি উপযুক্ত ত্রুটি কোড ফেরত দেওয়া হয়।

Paddleboat_ErrorCode Paddleboat_getControllerData(const int32_t controllerIndex,
  Paddleboat_Controller_Data *controllerData)

Paddleboat_Controller_Data কাঠামোতে কন্ট্রোলারের বর্তমান নিয়ন্ত্রণ ইনপুট মান রয়েছে।

typedef struct Paddleboat_Controller_Data {
    uint64_t timestamp;
    uint32_t buttonsDown;
    Paddleboat_Controller_Thumbstick leftStick;
    Paddleboat_Controller_Thumbstick rightStick;
    float triggerL1;
    float triggerL2;
    float triggerR1;
    float triggerR2;
    Paddleboat_Controller_Pointer virtualPointer;
} Paddleboat_Controller_Data;

typedef struct Paddleboat_Controller_Pointer {
    float pointerX;
    float pointerY;
} Paddleboat_Controller_Pointer;

typedef struct Paddleboat_Controller_Thumbstick {
    float stickX;
    float stickY;
} Paddleboat_Controller_Thumbstick;

মান পরিসীমা

ইনপুট টাইপ মান পরিসীমা
থাম্বস্টিক অক্ষ -1.0 থেকে 1.0
ট্রিগার 0.0 থেকে 1.0
ভার্চুয়াল পয়েন্টার 0.0 থেকে জানালার প্রস্থ/উচ্চতা (পিক্সেলে)

গঠন বিবরণ

কাঠামোর সদস্য বর্ণনা
buttonsDown বিট-প্রতি-বাটন বিটফিল্ড অ্যারে। বোতাম বিটমাস্ক ধ্রুবকগুলি paddleboat.h- এ সংজ্ঞায়িত করা হয়েছে। হেডার ফাইল এবং PADDLEBOAT_BUTTON_ দিয়ে শুরু করুন।
timestamp. সাম্প্রতিকতম কন্ট্রোলার ইনপুট ইভেন্টের টাইমস্ট্যাম্প। টাইমস্ট্যাম্প হল ঘড়ির যুগ থেকে মাইক্রোসেকেন্ড।
virtualPointer ভার্চুয়াল পয়েন্টার অবস্থান। শুধুমাত্র যদি PADDLEBOAT_CONTROLLER_FLAG_VIRTUAL_MOUSE পতাকা controllerFlags -এ সেট করা থাকে, অন্যথায় 0.0, 0.0 হবে।