2012-04-12 102 views
0

我正在寫一個遊戲,並希望能夠檢測何時同時按下兩個箭頭鍵。在C++中檢測WM_KEYUP和WM_KEYDOWN事件

例如:

如果起身離開壓制:我想如果UP單獨按下字符向西北移動
:我想要的字符向北移動
IF起來就走了壓制,並現在LEFT被釋放:我希望正在向西北移動的角色開始向北移動。

我試着用4個布爾值來實現這個功能,它跟蹤哪個箭頭鍵被按下。

LRESULT CALLBACK WindowProc (HWND hwnd, 
         UINT msg, 
         WPARAM wParam, 
         LPARAM lParam) 
{ 

     //Variables and stuff initialized 

    switch (msg) 
    { 
    case WM_CREATE:{//Stuff to initialize windows info}break; 

    case WM_COMMAND:{//Stuff that responds to menubar selections}break; 


    case WM_KEYDOWN: 
    { 
     switch(wParam) 
     { 
     case VK_UP:{moveUp=true;}break; 

       case VK_DOWN:{moveDown=true;}break; 

     case VK_LEFT:{moveLeft=true;}break; 

     case VK_RIGHT:{moveRight=true;}break; 

     //More cases for handling W,Q,A,S,D and SPACE inputs 

     default: //Stop moving character 

     } 
    } 

    //Make changes to player input over here 
    case WM_KEYUP: 
    { 
     switch(wParam) 
     { 
       //Cases for handling ESCAPE, P, R, W and SPACE inputs 

      case VK_UP:{moveUp=false;}break; 

       case VK_DOWN:{moveDown=false;}break; 

       case VK_LEFT: {moveLeft=false;}break; 

      case VK_RIGHT:{moveRight=false;}break; 
     }//end switch 

    }//end WM_KEYUP 

    break; 


    case WM_PAINT:{}break; 

    case WM_SIZE:{}break; 

    case WM_DESTROY:{}break; 

    }//end switch 


    return DefWindowProc (hwnd, msg, wParam, lParam); 
} 

而且它無法工作...爲moveUp,下移..和布爾變量被設置,如果我只是捕捉WM_KEYDOWN事件......但沒有被發現,他們在所有如果我用WM_KEYDOWN代碼使它們成爲虛假。

不知道這是爲什麼。使用字符鍵在我的遊戲中輸入特定模式時出現同樣的問題。只要'Q'被按下,我希望遊戲處於特殊模式,並在遊戲發佈時退出該模式。但即使這樣也行不通,就像這個箭頭鍵不起作用一樣。

有什麼我在這裏失蹤?

+0

你是什麼意思,他們根本沒有被發現?你的'WM_KEYDOWN'處理程序只是設置靜態/全局值,對吧?這不會影響WndProc是否接收消息。你遺漏了導致實際問題的代碼。 – 2012-04-12 17:01:40

回答

0

眼前的問題,我看是case WM_KEYDOWN:

失蹤break;聲明這意味着,每一次case WM_KEYDOWN: MOVEX設置爲true case WM_KEYUP:立即將其回false。你說moveX變量正在設置正確,當你「只是捕捉WM_KEYDOWN事件」,這表明這確實是問題。與case WM_KEYUP:註釋掉,控制將改爲case WM_PAINT:(你可能不會注意到)在打破之前。