आप एक स्थिर UI वर्ग के साथ गलत दृष्टिकोण ले रहे हैं। स्टैटिक कॉलबैक से एक इंस्टेंस फंक्शन तक "बाउंस" करने का सामान्य तरीका है कि स्टैटिक कॉलबैक से एक्सेस होने वाली जगह में जंप करने में सक्षम कुछ को स्टोर किया जाए।
GLFW और देशी Win32 की तरह अधिकांश एपीआई, कि इन प्रकार की स्थैतिक कॉलबैक की आवश्यकता होती है, एसोसिएशन को ऊपर बनाने का एक तरीका प्रदान करते हैं। GLFW विंडो में स्टोरेज के आकार का एक ब्लॉक होता है जिसे आप यूज कर सकते हैं: यूजर पॉइंटर । आप इस यूजर पॉइंटर को आवश्यकतानुसार प्राप्त या सेट कर सकते हैं ।
एक बहुत ही सामान्य पैटर्न में कुछ प्रकार की Game
कक्षा होती है जिसमें "HandleKeyPress (कुंजी कुंजी)" या whatnot जैसी विधियां होती हैं। जब आप प्रोग्राम शुरू करते हैं, तो आप 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
यदि आवश्यक हो तो उदाहरण अपने यूआई वस्तु के साथ अग्रेषित कर सकते हैं (या, यदि आप वास्तव में केवल यूआई वस्तु के लिए कीबोर्ड इनपुट की जरूरत है आप उपयोगकर्ता भंडारण में अपने यूआई वस्तु के लिए एक सूचक सिर्फ सामान सकता है, हालांकि, इस खेल की तरह कुछ भरावन या कुछ उच्च-स्तर आम तौर पर बेहतर होते हैं क्योंकि आपके पास उपयोग करने के लिए प्रति खिड़की केवल एक सूचक होता है)।