Цикл событий Windows обычно выглядит так:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Я хочу использовать XInput, чтобы проверить, нажата ли кнопка D-Pad, и если это так, нарисуйте что-нибудь на экране. Но какое событие я слушаю? Должен ли я даже слушать событие. После того, как я обработал нажатие кнопки, как я могу сказать программе что-то нарисовать?
Я не думаю, что контроллеры генерируют события, которые вы ловите в цикле событий, как это. (Я бы не стал клясться в этом)
Обычно то, что вы делаете, периодически (каждый кадр) вызывает XInputGetState (), который сообщит вам о состоянии контроллера. (Вы получаете заполненный XINPUT_STATE.) Если XInputGetState () возвращает ERROR_SUCCESS, то у вас есть допустимый контроллер с этим индексом, если XInputGetState () возвращает что-то отличное от ERROR_SUCCESS, тогда у вас нет рабочего контроллера с этим индексом. (В играх, над которыми я работал, мы опрашивали идентификаторы пользователей с 0 по 3, чтобы получить максимум 4 контроллера, но если ваша игра или приложение поддерживает больше контроллеров, чем вы, возможно, захотите опросить большее число. Не уверен, что это максимальное число )
Вам нужно будет сохранить XINPUT_STATE в каждом кадре, чтобы сравнить его с текущим состоянием. Сравнивая сохраненное состояние с текущим, вы можете узнать, изменились ли кнопки. Это также даст вам аналоговые значения для джойстиков и аналоговых триггеров.