1

私はゲームを書いていて、2 つの矢印キーが同時に押されたことを検出できるようにしたいと考えています。

例えば ​​:

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);
}

そして、動作していません... WM_KEYDOWNイベントをキャッチしているだけの場合、moveUp、moveDown ..、およびブール値が設定されています...しかし、WM_KEYDOWNコードを使用してそれらをfalseにすると、それらはまったく検出されません。

なぜそうなのかわかりません。キャラクター キーを使用してゲームの特定のモードに入るのと同じ問題がありました。「Q」を押している間、ゲームが特別なモードになり、リリース時にそのモードから抜け出したかったのです。しかし、この矢印キーが機能していないように、それでも機能しませんでした。

ここに欠けているものはありますか?

4

2 に答える 2

1

私が目にする差し迫った問題は、break;ステートメントの欠落ですcase WM_KEYDOWN:

これは、case WM_KEYDOWN:moveX を truecase WM_KEYUP:に設定するたびに、すぐに false に戻すことを意味します。「イベントをキャッチするだけ」のときにmoveX変数が正しく設定されていると言いましたが、WM_KEYDOWNこれは実際に問題であることを示唆しています。case WM_KEYUP:コメントアウトすると、ブレークする前に制御が流れますcase WM_PAINT:(おそらく気付かないでしょう)。

于 2014-11-14T13:56:43.927 に答える
0

おそらく、GetAsyncKeyState関数が役に立つでしょう。

于 2012-04-12T16:53:42.090 に答える