मैं 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 कुंजी के लिए इनपुट रखता है (एकमात्र तरीका जिससे मुझे महत्वपूर्ण घटनाएं मिल सकती हैं)। यहां से, कंसोल विंडो में कौन सी कुंजी दबाया गया है, यह प्रदर्शित करता है। मुझे जो परेशानी हो रही है, वह दूसरी कक्षा में एक चर को हेरफेर करने के लिए दबाए गए कुंजी का उपयोग करने की कोशिश कर रहा है।

मेरे पास एक अन्य वर्ग है जिसे मेनमेनू कहा जाता है जिसका फ़ंक्शन है update().क्या कोई तरीका है जो मैं इस फ़ंक्शन के भीतर अपने यूआई वर्ग का उपयोग कर सकता हूं?

जवाबों:


16

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


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)
}

कुछ इस तरह।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.