【发布时间】:2014-05-26 04:41:25
【问题描述】:
这是一个相当不寻常的问题,但我需要解释一下 Win32 如何处理不同的按键事件。
WM_KEYDOWN 用于接收长按,例如如果您在游戏中,并且想要前进,请按向上箭头键或“W”键,游戏中的角色就会继续前进。
由于WM_KEYDOWN,您不必多次按键。
我有一个基于 win32 的 3D OpenGL 应用程序,我在其中使用 'W-A-S-D' 和 arrow key 在 3D 世界中移动。它们都完全按照应有的方式工作。
话说回来,当我身处 3D 世界时,我能感觉到 Win32 处理 WASD 和箭头键的方式之间存在细微差别。
case UP_k:
f_zPosition-=CAM_MOVEMENT_SPEED;
break;
case 'W': 也使用相同的代码。
但在游戏中,由于某种原因,方向键的移动比WASD键的移动要流畅得多。
- Win32 如何在内部处理这些事件?
- 我该怎么做
WASD的移动就像箭头键一样流畅。
我想知道是否有人在 Win32 中注意到这一点,这是我的事件循环代码,按照 cmets 中的要求。
do
{
window.displayGL();
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
TranslateMessage(&msg);
DispatchMessage (&msg);
}while(msg.message != WM_QUIT);
【问题讨论】:
-
你能发布你的事件循环的代码吗?我的猜测是它与 TranslateMessage 函数有关。
-
我知道没有区别。当然,除非你有 Alt/Meta/etc。同时按下键;然后箭头键的行为略有不同。但是,如果您按下 Alt,则您必须完全处理不同的窗口消息。
-
@AndonM.Coleman,我目前没有使用 Alt。它简单的箭头键和 WASD。 jspurim,我已经添加了事件循环。
-
哦,嗯。你实际上在这里做了一些我建议你避免的事情:在按住键的同时依赖 autorepeat 一遍又一遍地发送
WM_KEYDOWN消息。我会总是忽略lParam位30 设置为1 的WM_KEYDOWN事件,这表示重复的关键消息。当用户按下按钮时,不要处理移动,而是在最初按下键时设置一个状态,然后在释放它时将其重置。当需要定期处理移动时,请检查设置的状态,而不是仅响应自动重复生成的消息。 -
你试过
TranslateMessage注释掉我建议的吗?有效果吗?
标签: c++ winapi opengl game-engine