คุณกำลังใช้วิธีผิดกับคลาส 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 ของคุณในการจัดเก็บข้อมูลผู้ใช้ แต่การบรรจุบางอย่างเช่นเกม หรือโดยทั่วไปแล้วสิ่งที่ระดับสูงกว่าดีกว่าเนื่องจากคุณมีเพียงหนึ่งตัวชี้ต่อหน้าต่างที่จะใช้)