2016-09-13 1 views
-1

以下は、キーが押されているかどうかを取得するために使用するコードです。キーの状態は状態によって更新されます。 私は値0,1,2,3の単純な配列に像を保持します。 の形式は次のとおりです。keyboardmap [256] = {0};Win32 WM_KEYDOWNとWM_KEYUPとステータスが "スタック"になった

問題は、これまでに何をしようとしても、キーはいつか固まってしまいます。あたかもWM_KEYUPが正常に起動しないかのようにゼロにリセットされることはありません。

while (true) 
    { 

    if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 

     if (msg.message == WM_QUIT) 
     { 
     break; 
     } 

     // Check for keystates and update them. 
     if (msg.message == WM_KEYDOWN) 
     { 
     // Fetch the key state. 
     unsigned int keycode = msg.wParam; 
     unsigned int cstate = engine.GetKeyState(msg.wParam); 

     if (engine.GetKeyState(keycode) == 0) 
     { 
      engine.SetKeyState(keycode, 1); // Just started pressing. 
     } 
     else 
     { 
      engine.SetKeyState(keycode, 2); // Actively pressed down. 
     } 
     } 
     else if (msg.message == WM_KEYUP) 
     { 
     // Fetch the key state. 
     unsigned int keycode = msg.wParam; 
     unsigned int cstate = engine.GetKeyState(msg.wParam); 

     if (engine.GetKeyState(keycode) == 2) 
     { 
      engine.SetKeyState(keycode, 3); 
     } 
     else 
     { 
      engine.SetKeyState(keycode, 0); 
     } 
     } 
    } 
    } 
+0

あなたはこのループは100を食べることを知っています%のCPU? 'PeekMessage'は非ブロックです。代わりに 'GetMessage'を使うことを考えましたか? –

+0

はい、私はそれを知っています、後でこれを制限します、これはリアルタイムゲームのためのものです。 –

+0

システムはすでにキーボードの状態を追跡しています。同じようにあなたに無意味です。 100%CPUは避けられます。 –

答えて

1

これはメッセージのループの仕組みではありません。あなたは常にゲーム/画面を更新する必要がゲームエンジンのために、次の例を使用します。

WNDCLASSEX wc = { sizeof(WNDCLASSEX) }; 
wc.lpfnWndProc = WndProc; 
wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
wc.lpszClassName = L"WindowClass"; 
RegisterClassEx(&wc); 

CreateWindow(...); 

MSG msg = { 0 }; 
while (msg.message != WM_QUIT) 
{ 
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    else 
    { 
     engine.update(); 
    } 
} 

ウィンドウのメッセージが別のウィンドウプロシージャで処理する必要があります:

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
    { 
    case WM_KEYDOWN: 
     break; 

    case WM_DESTROY: 
     PostQuitMessage(0); 
     return 0; 
    } 

    return DefWindowProc(hWnd, msg, wParam, lParam); 
} 
関連する問題