การป้อนข้อความในกิจกรรมเกม เป็นส่วนหนึ่งของชุดเครื่องมือพัฒนาเกม Android
GameActivity ผสานรวม GameTextInput โดย:
- การระบุ Wrapper
- สร้างแฟล็กสำหรับความพร้อมใช้งานของกิจกรรมการป้อนข้อความใหม่
- โดยใช้บัฟเฟอร์สถานะของ GameTextInput สําหรับเนื้อหาข้อความโดยตรง
ดังที่แสดงในแผนภาพต่อไปนี้ แอปพลิเคชันใช้ตรรกะภายในที่แตกต่างกัน คอมโพเนนต์เพื่อวัตถุประสงค์ในการป้อนข้อความของผู้ใช้ ได้แก่
การใช้ไลบรารี GameTextInput
ในตัวประกอบด้วย 3 ขั้นตอนกว้างๆ ดังนี้
- การควบคุมซอฟต์แป้นพิมพ์ใน UI
- การทราบเมื่อมีข้อความใหม่
- กำลังเรียกดูข้อความและสถานะที่ผู้ใช้ป้อน
ส่วนที่เหลือของเอกสารนี้จะอธิบายสิ่งเหล่านี้โดยละเอียด ตัวอย่างเช่น
GameTextInput
ที่มี GameActivity
กำลังดำเนินการ โปรดดู
ที่เก็บตัวอย่างเกม
ควบคุมแป้นพิมพ์เสมือนใน UI
GameActivity
มี 2 ฟังก์ชันสำหรับควบคุมซอฟต์แป้นพิมพ์ใน UI ดังนี้
GameActivity_showSoftInput()
แสดงแป้นพิมพ์เสมือนGameActivity_hideSoftInput()
ซ่อนแป้นพิมพ์เสมือน
โปรดดูคำจำกัดความในเอกสารอ้างอิง API หลังจาก UI ของแอปพลิเคชันอาจมีลักษณะคล้ายคลึงกับข้อความต่อไปนี้:
ตรวจสอบความพร้อมของข้อความ
มีการส่งเหตุการณ์แป้นพิมพ์แบบย่อจาก GameTextInput
ในฝั่ง Java ไปยังฟังก์ชัน
C/C++ ผ่าน JNI จากนั้นเดินทางไปยัง Wrapper ของ GameActivity สุดท้าย
แสดงในแฟล็ก android_app::textInputState
ใช้ใน native_app_glue
การสมัครงาน
ควรสอบถามแฟล็กนี้เป็นระยะๆ เพื่อดำเนินการตามที่กำหนดไว้:
- GameActivity จะตั้งค่าแฟล็ก
android_app::textInputState
เท่านั้น - แอปพลิเคชันจะสำรวจแฟล็กและจัดการเหตุการณ์
GameTextInput
ใหม่ เช่น ข้อความใหม่ที่เพิ่มลงในบัฟเฟอร์อินพุต - แอปพลิเคชันจะล้าง
android_app::textInputState
โปรดทราบว่า android_app::textInputState
ไม่ได้แยกความแตกต่างระหว่าง
และเหตุการณ์การป้อนข้อความหลายรายการ
ตัวอย่างง่ายๆ โค้ดต่อไปนี้จะดึงข้อมูลแฟล็ก textInputState
หลัง
การจัดการคำสั่งเกี่ยวกับรอบแอป เหตุการณ์การแตะ และเหตุการณ์สำคัญ
while (true) {
// Read all pending events.
int events;
struct android_poll_source* source;
while ((ALooper_pollAll(engine.animating ? 0 : -1, nullptr, &events,
(void**)&source)) >= 0) {
// Process this event, etc.
...
// Check if we are exiting.
if (app->destroyRequested != 0) {
engine_term_display(&engine);
return;
}
}
engine_handle_input(app);
// Process text input events if there is any outstanding.
if (app->textInputState) {
// process TextInput events.
...
//reset the textInputState flag
app->textInputState = 0;
}
if (engine.animating) {
// draw frames.
}
}
ดึงข้อความที่ผู้ใช้ป้อน
ข้อความอินพุตและสถานะอื่นๆ จะรวบรวมอยู่ใน
บัฟเฟอร์ภายใน GameTextInput::currentState_
การสมัครงาน
จะใช้วิธีใดวิธีหนึ่งต่อไปนี้เพื่อเรียกดูเนื้อหา
- Wrapper API ของ GameActivity (แนะนำ)
- API GameTextInput
รับสถานะ TextInput ด้วย GameActivity API
แอปพลิเคชันจะได้รับการป้อนข้อความปัจจุบันโดยใช้กลไก Callback โดยทั่วไป
- ใช้ฟังก์ชัน Callback ประเภท
GameTextInputGetStateCallback
เพื่อประมวลผลเหตุการณ์การป้อนข้อความ - โทรหา
GameActivity_getInputState()
เมื่อมีอย่างน้อย 1 หมายเลข เหตุการณ์ที่ค้างอยู่ - ล้าง
android_app::textInputState
หลังจากที่ประมวลผลเหตุการณ์แล้ว
มาต่อด้วยข้อมูลโค้ดในส่วนก่อนหน้านี้ ได้การอ้างอิงไปยังบัฟเฟอร์อินพุตข้อความ ประมวลผล (ไม่แสดง) และ รีเซ็ตค่าสถานะเหตุการณ์ดังนี้
extern "C" void GameTextInputGetStateCB(void *ctx, const struct GameTextInputState *state) {
auto* engine = (struct engine*)ctx;
if (!engine || !state) return;
// Process the text event(s).
LOGI("UserInputText: %s", state->text_UTF8);
// Clear the text input flag.
engine->app->textInputState = 0;
}
ใน Game Loop ที่แสดงในส่วนก่อนหน้า ให้ตรวจสอบและประมวลผลข้อความ ด้วยเครื่องจัดการข้อความข้างต้น
if (state->textInputState) {
GameActivity_getTextInputState(
app->activity,
GameTextInputGetStateCB, // App's event handler shown above.
&engine // Context to the GameTextInputGetStateCB function.
);
}
แอปพลิเคชันจะเลือกเริ่มต้นเนื้อหา GameTextInputState
ด้วยหรือไม่ก็ได้
GameActivity_setTextInputState()
รับสถานะ TextInput ด้วย GameTextInput API
แอปพลิเคชันยังใช้ GameTextInput
API เพื่อเรียกข้อมูลเหตุการณ์ปัจจุบันได้โดยตรง
GameTextInputState
:
- ใช้
GameActivity_getTextInput()
เพื่อรับอินสแตนซ์GameTextInput
ภายในของ GameActivity - เมื่อมีอินสแตนซ์
GameTextInput
อยู่ในมือแล้ว ให้เรียกใช้GameTextInput_getState()
เพื่อรับเนื้อหาGameTextInputState
เดียวกัน
ขอย้ำอีกครั้งว่าแอปพลิเคชันไม่ควรเริ่มต้น GameTextInput
โดยตรง GameActivity
มีอยู่แล้วในระหว่างกระบวนการเริ่มต้น
กลไกการติดต่อกลับจะเหมือนกับที่ใช้โดย
GameActivity_getTextInputState()
ข้อมูลอ้างอิง
แหล่งข้อมูลต่อไปนี้อาจมีประโยชน์สำหรับนักพัฒนาซอฟต์แวร์
GameActivity
แอปพลิเคชัน:
- เริ่มต้นใช้งาน GameActivity
- เอกสารประกอบสำหรับผู้ใช้ GameTextInput
- ตัวอย่าง agdkTunnel
- เอกสารประกอบอ้างอิงของ Jetpack สำหรับ GameActivity
- เอกสารประกอบอ้างอิงของ Jetpack สำหรับ GameTextInput
- ซอร์สโค้ด AGDK
ความคิดเห็น
GameActivity และ GameTextInput เป็นส่วนหนึ่งของคลังเกม Jetpack สำหรับทุกประเภท ปัญหาและคำถาม ให้สร้างข้อบกพร่องใน Google IssueTracker