ใช้ฟังก์ชันต่อไปนี้เพื่อเพิ่มการสนับสนุนตัวควบคุมเกมลงในเกมของคุณโดยใช้ ไลบรารีเกมคอนโทรลเลอร์
เริ่มต้นและทำลายไลบรารี Game Controller
ใช้Paddleboat_init
เพื่อเริ่มไลบรารีเกมคอนโทรลเลอร์
Paddleboat_ErrorCode Paddleboat_init(JNIEnv *env, jobject jcontext)
Paddleboat_init
ใส่พารามิเตอร์ 2 ตัว ได้แก่
- ตัวชี้ไปยัง
JNIEnv
แนบอยู่กับชุดข้อความปัจจุบัน - การอ้างอิงออบเจ็กต์ JNI
jobject
ไปยัง ได้รับคลาสContext
Context
ใดก็ได้ ออบเจ็กต์คลาสที่ได้มานั้นถูกต้อง ซึ่งรวมถึงแต่ไม่จำกัดเพียงActivity
,NativeActivity
, หรือGameActivity
Paddleboat_init
ทำรีเทิร์น
PADDLEBOAT_NO_ERROR
หากการเริ่มต้นสำเร็จ หรือรหัสข้อผิดพลาดที่เหมาะสม
คุณสามารถใช้ Paddleboat_isInitialized
เพื่อตรวจสอบว่าเกม
เริ่มต้นไลบรารีตัวควบคุมสำเร็จแล้ว แสดงผลบูลีน
หากจริง API จะพร้อมใช้งาน
bool Paddleboat_isInitialized()
ก่อนยุติแอปพลิเคชัน ให้ใช้
Paddleboat_destroy
เพื่อปิดไลบรารีของ Game Controller ฟังก์ชันใช้เวลา
ซึ่งเป็นตัวชี้ไปยัง JNIEnv
ที่แนบมากับชุดข้อความปัจจุบัน
ระบบอาจโทรหา Paddleboat_init
อีกครั้งหลังจากวันที่ Paddleboat_destroy
void Paddleboat_destroy(JNIEnv *env)
แจ้งคลังเหตุการณ์ในวงจร
ต้องแจ้งไลบรารีเกมคอนโทรลเลอร์เกี่ยวกับ
วงจรกิจกรรม
onStop
และ
onStart
กิจกรรม
เรียกใช้
Paddleboat_onStop
และ
Paddleboat_onStart
จากจุดแวะและเริ่มต้นโค้ดการจัดการเหตุการณ์ ทั้ง 2 ฟังก์ชันจะใช้
พารามิเตอร์เดียว: ตัวชี้ไปยัง JNIEnv
ที่แนบมากับชุดข้อความปัจจุบัน
void Paddleboat_onStop(JNIEnv *env)
void Paddleboat_onStart(JNIEnv *env)
ลงทะเบียนหรือนำการเรียกกลับสถานะตัวควบคุมออก
ไลบรารีเกมคอนโทรลเลอร์ใช้การเรียกกลับสถานะตัวควบคุมเพื่อแจ้งเกม เมื่อมีการเชื่อมต่อหรือเลิกเชื่อมต่อตัวควบคุม รองรับตัวควบคุมได้เพียง 1 รายการเท่านั้น สถานะ Callback ได้ครั้งละ 1 รายการ
- วิธีลงทะเบียน Callback สถานะของตัวควบคุมหรือแทนที่รายการใดๆ ก่อนหน้านี้
Callback ที่ลงทะเบียนด้วยฟังก์ชัน Callback ใหม่เรียก
Paddleboat_setControllerStatusCallback
- หากต้องการนำ Callback ที่ลงทะเบียนไว้ในปัจจุบันออก ให้ส่งบัตร
NULL
หรือnullptr
- พารามิเตอร์
userData
คือตัวชี้ที่ไม่บังคับไปยังข้อมูลที่ผู้ใช้กำหนด ระบบจะส่งพารามิเตอร์userData
ไปยังฟังก์ชัน Callback เคอร์เซอร์นี้ จะถูกเก็บไว้เป็นการภายใน จนกว่าจะมีการเปลี่ยนแปลงในการเรียกครั้งต่อๆ มาPaddleboat_setControllerStatusCallback
void Paddleboat_setControllerStatusCallback(Paddleboat_ControllerStatusCallback
statusCallback, void *userData)
ลายเซ็นของฟังก์ชันของฟังก์ชัน Callback คือ
typedef void (*Paddleboat_ControllerStatusCallback)(
const int32_t controllerIndex,
const Paddleboat_ControllerStatus controllerStatus,
void *userData)
พารามิเตอร์ | คำอธิบาย |
---|---|
controllerIndex
|
ดัชนีของตัวควบคุมที่เริ่ม
Callback จะเป็นค่าระหว่าง 0 ถึง PADDLEBOAT_MAX_CONTROLLERS - 1 |
controllerStatus
|
ค่า enum ของ
PADDLEBOAT_CONTROLLER_JUST_CONNECTED หรือ PADDLEBOAT_CONTROLLER_JUST_DISCONNECTED |
userData
|
เคอร์เซอร์ที่ไม่บังคับ (อาจเป็นค่าว่าง) สำหรับผู้ใช้
ข้อมูลที่กำหนดไว้โดยการเรียกครั้งล่าสุด
Paddleboat_setControllerStatusCallback |
เรียกใช้ฟังก์ชันอัปเดตคลังเกมคอนโทรลเลอร์
ฟังก์ชันอัปเดตคลังเกมคอนโทรลเลอร์
Paddleboat_update
ควรถูกเรียก 1 ครั้งต่อเฟรมเกม โดยควรเรียกในบริเวณใกล้จุดเริ่มต้นของเฟรม
ฟังก์ชันนี้รับพารามิเตอร์เดียว โดยชี้ไปยัง JNIEnv
ซึ่งแนบกับพารามิเตอร์
ชุดข้อความปัจจุบัน
void Paddleboat_update(JNIEnv *env)
ประมวลผลกิจกรรม
เมื่อได้รับเหตุการณ์อินพุต เกมจะต้อง ส่งต่อไปยังไลบรารี Game Controller เพื่อตรวจสอบ เกมคอนโทรลเลอร์ ไลบรารีจะประเมินว่าเหตุการณ์อินพุตเชื่อมโยงกับหนึ่งในเหตุการณ์ที่มีการจัดการหรือไม่ อุปกรณ์ ระบบจะประมวลผลและใช้เหตุการณ์จากอุปกรณ์ที่มีการจัดการ
ไลบรารีเกมคอนโทรลเลอร์รองรับเหตุการณ์การป้อนข้อมูล 2 ประเภท ดังนี้
AInputEvents
และ
เหตุการณ์การป้อนข้อมูล GameActivity
รายการ
การประมวลผล AInputEvent
เกมควรส่งต่อ AInputEvents
ด้วยการเรียกใช้
Paddleboat_processInputEvent
จากโค้ดการจัดการเหตุการณ์
int32_t Paddleboat_processInputEvent(const AInputEvent *event)
Paddleboat_processInputEvent
จะแสดงผล 0
หากไม่สนใจเหตุการณ์และ 1
เหตุการณ์ได้รับการประมวลผลและใช้งานโดยไลบรารีเกมคอนโทรลเลอร์หรือไม่
การประมวลผลเหตุการณ์ GameActivity
หากเกมใช้ GameActivity
ให้ไปข้างหน้า
GameActivityKeyEvent
และ
GameActivityMotionEvent
กิจกรรมด้วยการโทร
Paddleboat_processGameActivityKeyInputEvent
หรือ
Paddleboat_processGameActivityMotionInputEvent
จากโค้ดการจัดการเหตุการณ์
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 |
ทั้ง 2 ฟังก์ชันจะแสดงผล 0
หากละเว้นเหตุการณ์ และ 1
หากเหตุการณ์
ประมวลผลและใช้งานโดยไลบรารี Game Controller
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)
ฟังก์ชันสำหรับอ่านข้อมูลจากตัวควบคุมที่เชื่อมต่ออยู่มี 3 ฟังก์ชัน
Paddleboat_getControllerName
จะเรียกดูชื่อของอุปกรณ์ตัวควบคุมPaddleboat_getControllerInfo
จะเรียกดูข้อมูลเกี่ยวกับตัวอุปกรณ์ตัวควบคุมPaddleboat_getControllerData
จะดึงข้อมูลสถานะปัจจุบันของอินพุตตัวควบคุม
ชื่อตัวควบคุม
Paddleboat_getControllerName function
ใช้พารามิเตอร์อินพุต 2 ตัว ได้แก่ ดัชนีตัวควบคุม ขนาดบัฟเฟอร์ และตัวชี้ไปยัง
บัฟเฟอร์สำหรับจัดเก็บสตริงชื่อตัวควบคุม สตริงชื่อจะมีการจัดรูปแบบเป็น
สตริง C ที่ใช้การเข้ารหัส UTF-8 ได้รับชื่ออุปกรณ์เป็นการภายใน
ด้วย InputDevice.getName()
หาก Paddleboat_getControllerName
เรียกข้อมูลชื่อสำเร็จ ชื่อดังกล่าวจะแสดงผล
PADDLEBOAT_NO_ERROR
ไม่เช่นนั้นระบบจะส่งคืนรหัสข้อผิดพลาดที่เหมาะสม
Paddleboat_ErrorCode Paddleboat_getControllerName(const int32_t controllerIndex,
const size_t bufferSize,
char *controllerName);
พารามิเตอร์ | คำอธิบาย |
---|---|
controllerIndex
|
ดัชนีของตัวควบคุมที่เริ่ม
Callback จะเป็นค่าระหว่าง 0 ถึง PADDLEBOAT_MAX_CONTROLLERS - 1 |
bufferSize
|
ขนาดเป็นไบต์ของบัฟเฟอร์ที่ส่งผ่าน
controllerName สตริงชื่อจะเป็น
ถูกตัดให้สั้นลงหากจำเป็นเพื่อให้พอดีกับบัฟเฟอร์ |
controllerName
|
ตัวชี้ไปยังบัฟเฟอร์ขนาด bufferSize ไบต์
เพื่อจัดเก็บชื่อตัวควบคุมไว้ ชื่อจะ
เป็นสตริง C โดยใช้การเข้ารหัส UTF-8 |
ข้อมูลอุปกรณ์ตัวควบคุม
Paddleboat_getControllerInfo function
รับพารามิเตอร์อินพุต 2 ตัว ได้แก่
ดัชนีตัวควบคุมและตัวชี้ไปยังโครงสร้าง 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
แสดงถึงขอบเขตของตำแหน่งกึ่งกลางแบบแบน โดยปกติค่านี้จะมีประโยชน์ในการคํานวณ "dead-zone" ที่กึ่งกลางเริ่มต้น ในวันที่ อุปกรณ์แบบ Self-centering - ค่า
stickFuzz
แสดงถึงค่าความคลาดเคลื่อนที่ยอมรับได้ หรือระดับความคลาดเคลื่อนปัจจุบัน ค่าอาจเบี่ยงเบนไปจากค่าจริงเนื่องจากเสียงรบกวนและความไวของอุปกรณ์
ทั้ง 2 ค่าจะได้รับการปรับให้เป็นค่าแกนสูงสุด 1.0
ในมิติข้อมูลใดก็ได้
สมาชิก controllerFlags
มีชุดค่าผสมของบิตมาสก์แต่ละรายการ
แฟล็กและค่าผสมแบบหลายบิต
การแสดง AND
เชิงตรรกะของ controllerFlags
ด้วย
PADDLEBOAT_CONTROLLER_LAYOUT_MASK
จะทำให้มีค่าที่สามารถแปลงเป็นค่า
enum Paddleboat_ControllerButtonLayout
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
};
ค่าคงที่ต่อไปนี้จะกำหนดบิตความสามารถ วิธีระบุว่าผู้ควบคุมข้อมูล
สนับสนุนความสามารถเฉพาะ ให้ดำเนินการ AND
เชิงตรรกะของฟังก์ชัน
ค่าคงที่ที่เทียบกับ controllerFlags
ผลลัพธ์ที่ไม่เป็น 0 หมายความว่าความสามารถนั้น
ที่ตัวควบคุมรองรับ
PADDLEBOAT_CONTROLLER_FLAG_TOUCHPAD
หากตั้งค่าดอกสว่านชุดนี้ไว้ ตัวควบคุมจะมีทัชแพดแบบผสานรวม หาก
เมื่อกดทัชแพด ตัวควบคุมจะตั้งค่าบิต PADDLEBOAT_BUTTON_TOUCHPAD
ไว้ใน
ฟิลด์ Paddleboat_Controller_Data.buttonsDown
PADDLEBOAT_CONTROLLER_FLAG_VIRTUAL_MOUSE
หากตั้งค่าบิตแฟล็กนี้ไว้ ตัวควบคุมจะจำลองอุปกรณ์ตัวชี้
สมาชิก virtualPointer
รายของโครงสร้าง Paddleboat_Controller_Data
คือ
สร้างขึ้นด้วยพิกัดปัจจุบันของตัวชี้เสมือน
ข้อมูลตัวควบคุม
ฟังก์ชัน Paddleboat_getControllerData
รับพารามิเตอร์อินพุต 2 ตัว ได้แก่
ดัชนีตัวควบคุมและตัวชี้ไปยังโครงสร้าง 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;
ช่วงของค่า
ประเภทอินพุต | ช่วงของค่า |
---|---|
แกนของ Thumbstick | -1.0 ถึง 1.0 |
ทริกเกอร์ | 0.0 ถึง 1.0 |
เคอร์เซอร์เสมือน | 0.0 ถึงความกว้าง/ความสูงของหน้าต่าง (เป็นพิกเซล) |
รายละเอียดโครงสร้าง
สมาชิกในบ้าน | คำอธิบาย |
---|---|
buttonsDown
|
อาร์เรย์บิตฟิลด์แบบบิตต่อปุ่ม ปุ่มบิตมาสก์
ค่าคงที่จะกำหนดไว้ใน paddleboarding.h
ไฟล์ส่วนหัวและขึ้นต้นด้วย
PADDLEBOAT_BUTTON_ |
timestamp.
|
การประทับเวลาของอินพุตตัวควบคุมล่าสุด กิจกรรม การประทับเวลาเป็นไมโครวินาทีนับตั้งแต่ ของ Epoch ของนาฬิกา |
virtualPointer
|
ตำแหน่งของตัวชี้เสมือน ใช้ได้เฉพาะในกรณีที่
แฟล็ก PADDLEBOAT_CONTROLLER_FLAG_VIRTUAL_MOUSE รายการ
ได้รับการตั้งค่าใน controllerFlags มิฉะนั้นจะเป็น
0.0, 0.0 |