3

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 ゲームをビルドしようとしていることです。


だから、私の質問は - ユーザー入力を操作する正しい方法はどれですか? それとも、私が見逃した方法がありますか?

4

0 に答える 0