আমি কীভাবে জিএলএফডাব্লু এর কীবোর্ড ইনপুটটিকে অন্য কোনও বস্তুর কাছে ফরোয়ার্ড করতে পারি?


9

জিএলএফডাব্লু 3 সহ অন্য একটি ক্লাসে কীবোর্ড ইভেন্টগুলি চালানোর চেষ্টা করতে আমার সমস্যা হচ্ছে। আমার যে সমস্যা হচ্ছে তা হ'ল জিএলএফডাব্লু 3 ইনপুট জন্য প্রদর্শিত হিসাবে একটি স্থির ফাংশন ব্যবহার করে:

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

uএছাড়াও স্থিতিশীল এবং নিয়ন্ত্রণগুলি ডাব্লুএসএডি কী (কেবলমাত্র আমি কী ইভেন্টগুলি পেতে পারি) এর ইনপুট ধারণ করে get এখান থেকে, একটি কী টিপুন যা কনসোল উইন্ডোতে কোন কী টিপছে তা প্রদর্শন করে works আমার যে সমস্যাটি হচ্ছে তা হ'ল অন্য ক্লাসের ভেরিয়েবলটি ম্যানিপুলেট করার জন্য চাপানো কীটি ব্যবহার করার চেষ্টা করছে।

আমার মেইনেনু নামে আরও একটি ক্লাস রয়েছে যার ফাংশন update().রয়েছে এই ফাংশনের মধ্যে আমার ইউআই ক্লাসটি ব্যবহার করার কোনও উপায় আছে কি?

উত্তর:


16

আপনি একটি স্থিতিশীল UI শ্রেণীর সাথে ভুল পদ্ধতি গ্রহণ করছেন। স্ট্যাটিক কলব্যাক থেকে একটি ইভেন্ট ফাংশনে "বাউন্স" করার স্বাভাবিক উপায় হ'ল স্থির কলব্যাক থেকে অ্যাক্সেসযোগ্য এমন জায়গায় লাফিয়ে উঠতে সক্ষম এমন কিছু সঞ্চয় করা।

জিএলএফডাব্লু এবং নেটিভ উইন 32 এর মতো বেশিরভাগ এপিআইগুলিকে এই ধরণের স্ট্যাটিক কলব্যাকের প্রয়োজন হয় উপরের সমিতিটি তৈরি করার একটি উপায় সরবরাহ করে। জিএলএফডাব্লু উইন্ডোতে স্টোরের একটি পয়েন্টার আকারের ব্লক রয়েছে যা আপনি নির্ধারণ করতে পারবেন: ব্যবহারকারী পয়েন্টার । আপনি প্রয়োজন হিসাবে এই ব্যবহারকারী পয়েন্টারটি পেতে বা সেট করতে পারেন ।

খুব সাধারণ প্যাটার্ন হ'ল কিছু ধরণের Gameক্লাস থাকে যার "হ্যান্ডলকিপ্রিপ (কী কী)" বা হোয়াট নোটের মতো পদ্ধতি রয়েছে। আপনি যখন প্রোগ্রাম শুরু করবেন, আপনি Gameঅবজেক্টটি তৈরি করেন এবং আপনার সমস্ত জিএলএফডাব্লু সূচনা করেন, তারপরে 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)
}

একরকম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.