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