我正在编写游戏,希望能够同时检测到两个箭头键的时间。
例如:
如果按下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 ..和bools正在被设置......但是如果我使用WM_KEYDOWN代码使它们变为假,它们根本就没被检测到。
不知道为什么会这样。使用字符键在我的游戏中进入特定模式时遇到同样的问题。只要按下“Q”,我就希望游戏处于特殊模式,并在游戏发布时退出该模式。但即使这样也行不通,就像这个箭头键不起作用一样。
我在这里缺少什么吗?
答案 0 :(得分:0)
也许GetAsyncKeyState函数对您有用。
答案 1 :(得分:0)
我看到的直接问题是break;
case WM_KEYDOWN:
声明
这意味着每次case WM_KEYDOWN:
将moveX设置为true case WM_KEYUP:
时,会立即将其设置为false。你说当你正在捕捉WM_KEYDOWN
事件时,正确设置moveX变量"这表明这确实是个问题。在case WM_KEYUP:
注释掉之后,控件将会在打破之前流入case WM_PAINT:
(您可能不会注意到)。