1

我正在编写一个游戏,并希望能够检测同时按下两个箭头键的时间。

例如 :

如果按下 UP 和 LEFT :我想让角色向西北移动
如果单独按下 UP :我想让角色向北
移动只向北移动。

我尝试使用 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 代码使它们为假,则根本不会检测到它们。

不知道为什么会这样。在我的游戏中使用字符键进入特定模式时遇到了同样的问题。只要按下“Q”,我就希望游戏处于特殊模式,并在发布时退出该模式。但即使这样也不起作用,就像这个箭头键不起作用一样。

我在这里缺少什么吗?

4

2 回答 2

1

我看到的直接问题是缺少的break;声明case WM_KEYDOWN:

这意味着每次case WM_KEYDOWN:将 moveX 设置为 true时都会case WM_KEYUP:立即将其设置回 false。您说当您“只是捕捉WM_KEYDOWN事件”时正确设置了 moveX 变量,这表明这确实是问题所在。注释掉后,控制将在中断之前case WM_KEYUP:流入case WM_PAINT:(您可能不会注意到)。

于 2014-11-14T13:56:43.927 回答
0

Maybe the GetAsyncKeyState function would be of use to you.

于 2012-04-12T16:53:42.090 回答