2012-04-12 5 views
0

私はゲームを作成しており、2つの矢印キーが同時に押されたときに検出できるようにしたいと考えています。例えばC++でのWM_KEYUPイベントとWM_KEYDOWNイベントの検出

UPとLEFTが押された場合:私は一人でUPを押すと文字が北西
を移動したい:私はUPとLEFTが押されていた場合、文字が
北に移動すると、 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という、moveDown ...と私はちょうどWM_KEYDOWNイベントをキャッチしていた場合boolsが設定されている...しかし、私はWM_KEYDOWNコードを使用する場合、彼らは全く検出されませんそれらを偽にする。

これがなぜそうであるか分かりません。私のゲームで特定のモードに入るために文字キーを使って同じ問題があった。 「Q」が押されている限り、私はゲームを特別なモードにして、それがリリースされたときにそのモードから出たいと思っていました。しかし、この矢印キーのようなものは機能しませんでした。

ここには何かがありますか?

+0

彼らは全く検出されていないとはどういう意味ですか?あなたの 'WM_KEYDOWN'ハンドラは単純に静的/グローバル値を設定しています。これは、WndProcがメッセージを受信するかどうかには影響しません。実際の問題の原因となっているコードを削除しました。 –

答えて

0

私が見る当面の問題は、これが本当case WM_KEYUP:に毎回case WM_KEYDOWN:セットmoveXはすぐに戻ってfalseに設定することを意味しcase WM_KEYDOWN:

のため行方不明break;文です。あなたは、単に "WM_KEYDOWNイベントをキャッチしている"ときにmoveX変数が正しく設定されていると言っています。これは実際に問題があることを示しています。 case WM_KEYUP:がコメントアウトされている場合、制御は破られる前にcase WM_PAINT:(おそらく気づいていないでしょう)に流れます。