Windows 用の OpenGL ゲームでユーザー入力を操作する最良の方法を見つけようとしています。私には次の 4 つの選択肢があります。
(1)次のように、レンダリングも含むメイン メッセージ ループ内のゲーム ウィンドウのメッセージをのぞくだけです。
while (running) {
while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
DispatchMessage(&msg);
}
render();
SwapBuffers(hDC);
}
//...
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
//do something with messages
}
これは、ほとんどの OpenGL チュートリアルで使用される方法です。この方法の大きな問題は、FPS 依存性にあります。
(2) WH_KEYBOARD_LL / WH_MOUSE_LL とは別のスレッドでSetWindowsHookExを使用します。
HHOOK hhK = SetWindowsHookEx(WH_KEYBOARD_LL,
[](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
//handle keyboard
return CallNextHookEx(0, nCode, wParam, lParam);
}
, GetModuleHandle(NULL), NULL);
HHOOK hhM = SetWindowsHookEx(WH_MOUSE_LL,
[](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
MSLLHOOKSTRUCT *pkbhs = (MSLLHOOKSTRUCT *) lParam;
//handle mouse
return CallNextHookEx(0, nCode, wParam, lParam);
}
, GetModuleHandle(NULL), NULL);
//We don't event have to create a window
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
このメソッドを使用すると、1 秒あたり任意の数のメッセージを表示できますが、人工的すぎるように思えます + システム内のユーザー入力全体がフックされるため、これも正しくないように思えます。
(3) (2) と同じですが、WH_KEYBOARD / WH_MOUSE を使用します。オーバーヘッドのように見える別の .dll が必要です。
(4) DirectInputを使用します。試しませんでしたが、ドキュメントとチュートリアルで見たものからすると、これが最良の方法かもしれません + ゲームパッドからも簡単に入力をキャプチャできます。
問題は、DirectInput が DirectX の一部であるにもかかわらず、OpenGL ゲームをビルドしようとしていることです。
だから、私の質問は - ユーザー入力を操作する正しい方法はどれですか? それとも、私が見逃した方法がありますか?