【发布时间】:2012-04-12 16:48:33
【问题描述】:
我正在编写一个游戏,并希望能够检测两个箭头键何时被同时按下。
例如:
如果按下 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 代码使它们为假,它们根本不会被检测到.
不知道为什么会这样。在我的游戏中使用字符键进入特定模式时遇到了同样的问题。只要按下“Q”,我就希望游戏处于特殊模式,并在发布时退出该模式。但即使这样也不起作用,就像这个箭头键不起作用一样。
我在这里缺少什么吗?
【问题讨论】:
-
根本没有检测到它们是什么意思?您的
WM_KEYDOWN处理程序只是设置静态/全局值,对吗?这不会影响 WndProc 是否接收消息。您遗漏了导致实际问题的代码。
标签: c++ winapi user-interface user-input