2015-04-02 22 views
1

钍Windows事件循环通常是这样的:哪个事件侦听期间XINPUT事件

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-键盘按钮,如果是这样,在屏幕上绘制的东西。但是,我倾听哪个活动?我应该甚至听一个事件。一旦我处理了按钮按下,我该如何告诉程序绘制一些东西?

回答

1

我不认为控制器会产生你在事件循环中捕获的事件。 (我不会绝对发誓)

通常你所做的是定期(每帧)调用XInputGetState()它会告诉你控制器的状态。 (如果XInputGetState()返回的是ERROR_SUCCESS以外的内容,那么在该索引处没有工作控制器。如果XInputGetState()返回ERROR_SUCCESS,那么您在该索引处有一个有效的控制器。 (在我参与过的游戏中,我们通过轮询用户ID 0到3来获得最多4个控制器,但是如果您的游戏或应用程序支持的控制器比您想要轮询更多数字的控制器多,不知道最大数量是多少)

您需要保存每个帧的XINPUT_STATE,以便您可以将其与当前状态进行比较。通过将保存的状态与当前状态进行比较,可以确定按钮是否已更改。这也将为您提供游戏杆和模拟触发器的模拟值。