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クラスで間違ったアプローチを取っています。静的コールバックからインスタンス関数に「バウンス」する通常の方法は、静的コールバックからアクセス可能な場所にジャンプを実行できるものを格納することです。

GLFWやネイティブWin32など、これらの種類の静的コールバックを必要とするほとんどのAPIは、上記の関連付けを行う方法を提供します。GLFWウィンドウには、ユーザーサイズに割り当てることができるポインターサイズのストレージブロックがあります。必要に応じて、このユーザーポインターを取得または設定できます。

非常に一般的なパターンは、Game"HandleKeyPress(Key key)"などのメソッドを持つクラスのようなものです。プログラムが開始したら、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(...);
}

HandleKeyDownGameインスタンスメソッドは、必要に応じてUIオブジェクトに転送できます(または、UIオブジェクトのキーボード入力だけが必要な場合は、ユーザーストレージにUIオブジェクトへのポインターを詰め込むだけで、ゲームのようなものを詰め込むことができます)または、使用するウィンドウごとにポインタが1つしかないため、一般的にはより高いレベルの方が優れています。


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.