捕获游戏中用户输入的最佳方式

时间:2014-05-02 14:49:07

标签: c++ winapi opengl input directinput

我试图找出在Windows的OpenGL游戏中使用用户输入的最佳方法。我有四种选择:

(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);
}

这种方法允许我每秒查看任意数量的消息,但这对我来说似乎过于模糊+它将整个用户输入挂钩到系统中,这对我来说似乎也不对。

(3)与(2)相同,但使用WH_KEYBOARD / WH_MOUSE。需要一个单独的.dll,这似乎是一个开销。

(4)使用 DirectInput 。没试过,但是从我在文档和教程中看到的,可能是最好的方式+我们可以轻松地从游戏手柄捕获输入。

问题是我正在尝试构建OpenGL游戏,而DirectInput是DirectX的一部分。


所以,我的问题是 - 哪种方式是使用用户输入的正确方法?或者也许我错过了哪些方法?

0 个答案:

没有答案