Я делаю игру на основе fps. В настоящее время у меня есть функция wnd_proc для захвата всех событий для ввода (WM_MOUSEMOVE, WM_KEYUP, WM_KEYDOWN, …). Моя мышь используется для перемещения камеры, как в FPS. Работает нормально, только когда я двигаю мышью. Но когда я нажимаю на клавиши для перемещения персонажа и одновременно перемещаю мышь, происходит задержка в обнаружении движения мыши в игре. Я также замечаю задержку, когда нажимаю на несколько клавиш.
Для событий клавиатуры вместо того, чтобы использовать собственный класс ввода для проверки нажатия клавиш, я использую GetAsyncKeyState () для чтения информации с клавиатуры, и это устраняет задержку нескольких клавиш. Но моя мышь все еще проблема. Есть ли функция асинхронного движения мыши?
—РЕДАКТИРОВАТЬ—
Это мой класс системы ввода, который вызывается во время функции wndproc.
class InputSystem : public System
{
...
...
...
void ProcessInput(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LPBYTE lpb;
UINT dwSize;
RAWINPUT *raw;
switch (message)
{
case WM_INPUT:
{
GetRawInputData((HRAWINPUT)lParam,
RID_INPUT,
NULL,
&dwSize,
sizeof(RAWINPUTHEADER));
lpb = new BYTE[dwSize];
if (lpb == NULL)
return;
if (GetRawInputData((HRAWINPUT)lParam,
RID_INPUT,
lpb,
&dwSize,
sizeof(RAWINPUTHEADER)) != dwSize)
MessageBox(hWnd, L"GetRawInputData returning wrong size!", L"Orhhor! Bao zha liao!", MB_OK);
raw = (RAWINPUT*)lpb;
if (raw->header.dwType == RIM_TYPEKEYBOARD)
{
if (raw->data.keyboard.Message == WM_KEYDOWN ||
raw->data.keyboard.Message == WM_SYSKEYDOWN)
{
input.ReadInput(raw->data.keyboard.VKey);
}
else if (raw->data.keyboard.Message == WM_KEYUP ||
raw->data.keyboard.Message == WM_SYSKEYUP)
{
input.ResetInput(raw->data.keyboard.VKey);
}
}
delete[] lpb;
return;
}
Пока ниже мой класс ввода
class Input
{
bool keys[256];
bool prevKeys[256];
...
...
...
}
void Input::InitInput()
{
...
...
...
auto hWnd = CORE->GetSystem<WindowManager>()->GetWindowHandle();
RAWINPUTDEVICE Rid[2];
Rid[0].usUsagePage = 0x01;
Rid[0].usUsage = 0x06; //keyboard
Rid[0].dwFlags = RIDEV_INPUTSINK;
Rid[0].hwndTarget = hWnd;
if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == false)
assert("Keyboard not registered.");
Rid[0].usUsagePage = 0x01;
Rid[0].usUsage = 0x02; //mouse
Rid[0].dwFlags = RIDEV_INPUTSINK;
Rid[0].hwndTarget = hWnd;
if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[1])) == false)
assert("Mouse not registered.");
for (int i = 0; i < 256; ++i)
{
keys[i] = false;
prevKeys[i] = false;
}
}
void Input::ReadInput(WPARAM w)
{
keys[w] = true;
return;
}
void Input::ResetInput(WPARAM w)
{
keys[w] = prevKeys[w] = false;
return;
}
bool Input::KeyPressed(int key)
{
if (!prevKeys[key] && keys[key])
{
prevKeys[key] = true;
return true;
}
return false;
}
bool Input::KeyDown(int key)
{
return keys[key];
}
Задача ещё не решена.
Других решений пока нет …