การป้อนข้อความในกิจกรรมเกม เป็นส่วนหนึ่งของชุดเครื่องมือพัฒนาเกม Android

GameActivity ผสานรวม GameTextInput โดย:

  • การระบุ Wrapper
  • สร้างแฟล็กสำหรับความพร้อมใช้งานของกิจกรรมการป้อนข้อความใหม่
  • โดยใช้บัฟเฟอร์สถานะของ GameTextInput สําหรับเนื้อหาข้อความโดยตรง

ดังที่แสดงในแผนภาพต่อไปนี้ แอปพลิเคชันใช้ตรรกะภายในที่แตกต่างกัน คอมโพเนนต์เพื่อวัตถุประสงค์ในการป้อนข้อความของผู้ใช้ ได้แก่

ข้อความสำรอง

การใช้ไลบรารี GameTextInput ในตัวประกอบด้วย 3 ขั้นตอนกว้างๆ ดังนี้

  • การควบคุมซอฟต์แป้นพิมพ์ใน UI
  • การทราบเมื่อมีข้อความใหม่
  • กำลังเรียกดูข้อความและสถานะที่ผู้ใช้ป้อน

ส่วนที่เหลือของเอกสารนี้จะอธิบายสิ่งเหล่านี้โดยละเอียด ตัวอย่างเช่น GameTextInput ที่มี GameActivity กำลังดำเนินการ โปรดดู ที่เก็บตัวอย่างเกม

ควบคุมแป้นพิมพ์เสมือนใน UI

GameActivity มี 2 ฟังก์ชันสำหรับควบคุมซอฟต์แป้นพิมพ์ใน UI ดังนี้

โปรดดูคำจำกัดความในเอกสารอ้างอิง 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 เป็นส่วนหนึ่งของคลังเกม Jetpack สำหรับทุกประเภท ปัญหาและคำถาม ให้สร้างข้อบกพร่องใน Google IssueTracker