Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在游戏中捕捉用户输入的最佳方式_C++_Winapi_Opengl_Input_Directinput - Fatal编程技术网

C++ 在游戏中捕捉用户输入的最佳方式

C++ 在游戏中捕捉用户输入的最佳方式,c++,winapi,opengl,input,directinput,C++,Winapi,Opengl,Input,Directinput,我试图找出在OpenGL Windows游戏中使用用户输入的最佳方法。我有四个选择: (1)只需在主消息循环中查看游戏窗口的消息,其中还包含渲染,如下所示: while (running) { while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) { DispatchMessage(&msg); } render(); SwapBuffers(hDC); } //... LRESULT

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

(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)在一个单独的线程中使用SetWindowsHookEx,使用WH\u键盘LL/WH\u鼠标LL:

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)相同,但使用WHU键盘/WHU鼠标。需要单独的.dll,这似乎是一种开销

(4)使用DirectInput。我没有尝试过,但从我在文档和教程中看到的,这可能是最好的方法+我们也可以轻松地从gamepad捕获输入

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



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

他们谈论的是我不想使用的跨平台库,并告诉我“你必须去操作系统API收集输入”——这正是我想要做的……首先决定你在做什么类型的游戏。格斗游戏可能会以高于刷新显示的固定频率轮询输入,但在其他类型的游戏中,您可以将输入作为事件循环/消息泵中的一系列事件进行处理,并且只处理每帧开始时对输入的更改。@AndonM.Coleman基本上,我需要一个完全独立于FPS的输入。然后,您需要从输入事件处理程序中提取一个单独的线程,或者在单独的线程中轮询您的输入。但是,如果允许绘图导致输入采样率的变化(例如,
SwapBuffers(…)
导致无法预测的时间阻塞),则无法实现该特性。在单个线程中,使用事件方法以及可变帧率不会错过任何输入事件,但您也不知道事件发生的确切时间。