ฉันจะส่งต่อคีย์บอร์ดอินพุตของ GLFW ไปยังวัตถุอื่นได้อย่างไร


9

ฉันมีปัญหาในการพยายามเรียกใช้เหตุการณ์แป้นพิมพ์ในคลาสอื่นด้วย GLFW3 ปัญหาที่ฉันมีคือ GLFW3 ใช้ฟังก์ชั่นคงที่สำหรับการป้อนข้อมูลตามที่แสดง:

static UI u;
...
...
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    u.controls(window, key, action);
}

uเป็นแบบสแตติกและส่วนควบคุมจะเก็บอินพุตสำหรับคีย์ WSAD (วิธีเดียวที่ฉันจะได้รับเหตุการณ์สำคัญ) จากที่นี่การกดแป้นจะทำงานเพื่อแสดงว่ามีการกดแป้นใดในหน้าต่างคอนโซล ปัญหาที่ฉันมีคือพยายามใช้แป้นกดเพื่อจัดการกับตัวแปรในคลาสอื่น

ฉันมีคลาสอื่นที่เรียกว่า MainMenu ที่มีฟังก์ชั่นupdate().มีวิธีที่ฉันสามารถใช้คลาส UI ของฉันภายในฟังก์ชั่นนี้หรือไม่?

คำตอบ:


16

คุณกำลังใช้วิธีผิดกับคลาส UI แบบคงที่ วิธีปกติในการ "ตีกลับ" จากการเรียกกลับแบบคงที่ไปยังฟังก์ชันอินสแตนซ์คือการจัดเก็บสิ่งที่สามารถกระโดดได้ในสถานที่ที่สามารถเข้าถึงได้จากการโทรกลับแบบคงที่

APIs ส่วนใหญ่เช่น GLFW และ Win32 ดั้งเดิมซึ่งต้องการการเรียกกลับแบบคงที่เหล่านี้เป็นวิธีการเชื่อมโยงดังกล่าวข้างต้น หน้าต่าง GLFW มีบล็อกตัวชี้ขนาดของการจัดเก็บที่คุณสามารถกำหนดให้คือตัวชี้ผู้ใช้ คุณสามารถรับหรือตั้งค่าตัวชี้ผู้ใช้นี้ได้ตามต้องการ

รูปแบบที่พบบ่อยมากคือการมีGameคลาสบางประเภทที่มีวิธีการเช่น "HandleKeyPress (คีย์คีย์)" หรืออะไรก็ตาม เมื่อโปรแกรมของคุณเริ่มต้นคุณสร้างGameวัตถุและทำการเริ่มต้น GLFW ทั้งหมดของคุณจากนั้นใส่Gameตัวชี้ลงในที่เก็บข้อมูลผู้ใช้:

int main () {
  GLFWindow * window = ... create GLFW window ...
  Game game(... game constructor parameters ...);

  glfwSetWindowUserPointer(window, &game);

  ... main game loop ...
}

จากนั้นการเรียกกลับคีย์บอร์ดของคุณ (และการเรียกกลับแบบคงที่อื่น ๆ ทั้งหมด) สามารถแยกการGame *จัดเก็บข้อมูลจากตัวชี้ผู้ใช้และส่งต่อไปยัง:

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
  Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
  game->HandleKeyDown(...);
}

HandleKeyDownวิธีการในGameอินสแตนซ์สามารถส่งต่อไปยังวัตถุที่คุณ UI ถ้าจำเป็น (หรือถ้าคุณจริงๆเท่านั้นต้องใส่แป้นพิมพ์สำหรับวัตถุ UI ที่คุณก็สามารถสิ่งที่ชี้ไปยังวัตถุ UI ของคุณในการจัดเก็บข้อมูลผู้ใช้ แต่การบรรจุบางอย่างเช่นเกม หรือโดยทั่วไปแล้วสิ่งที่ระดับสูงกว่าดีกว่าเนื่องจากคุณมีเพียงหนึ่งตัวชี้ต่อหน้าต่างที่จะใช้)


0

วิธีที่ฉันได้รับสิ่งนี้ในตอนนี้คือการใช้วัตถุเดี่ยวเมื่อฉันต้องการเข้าถึงชั้นเรียนฉันสามารถดึงตัวชี้ไปยังซิงเกิล:

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    InputManager * in_manager = InputManager::get_instance();
    in_manager->handle_key_press( params)
}

บางคนชอบแบบนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.