gpt4 book ai didi

c++ - WM_KEYDOWN 如何处理不同的键?

转载 作者:搜寻专家 更新时间:2023-10-31 00:35:26 25 4
gpt4 key购买 nike

这是一个相当不寻常的问题,但我需要一些关于 Win32 究竟如何处理不同的按键事件的解释。

WM_KEYDOWN 当您想要接收长​​按时使用,例如如果您在游戏中,并且想要前进,请按向上箭头键或“W”键,游戏中的角色会继续前进。由于 WM_KEYDOWN,您不必多次按键。

我有一个基于 win32 的 3D OpenGL 应用程序,我在其中使用“W-A-S-D”和 箭头键 在 3D 世界中四处移动。它们都按照预期的方式工作。

也就是说,当我在 3D 世界中时,我能感觉到 Win32 处理 WASD 和箭头键的方式之间存在细微差别。

    case UP_k: 
f_zPosition-=CAM_MOVEMENT_SPEED;
break;

同样的代码也用于 case 'W':

但在游戏中,由于某些原因,箭头键的移动比 WASD 键的移动要流畅得多。

  1. Win32 如何在内部处理这些事件?
  2. 我怎样才能WASD 的移动像箭头键一样流畅。

我想知道是否有人在 Win32 中注意到这一点,这是我的事件循环代码,按照评论中的要求。

do
{
window.displayGL();
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
TranslateMessage(&msg);
DispatchMessage (&msg);

}while(msg.message != WM_QUIT);

最佳答案

win32 应用程序上的正常消息处理循环调用两个函数:

TranslateMessage(&msg);
DispatchMessage(&msg);

第一个函数,TranslateMessage 查看虚拟键消息(例如 WM_KEYDOWN 消息),如果按下的键对应于字符键。如果您按住 'W' 键,由于自动重复功能,会生成很多 WM_KEYDOWN。箭头键也是如此,但在 'W' 的情况下,对于每个 WM_KEYDOWN 也会生成一个 WM_CHAR,这是您的应用程序将不得不处理。

即使您的应用程序只是查看 WM_CHAR 并丢弃它们,由此产生的延迟也可能很明显,尤其是因为您每次处理 WM_KEYDOWN 时都会移动相机/p>

更多信息请查看this .

解决方案:

您应该使移动速度独立于处理输入的速度。有两种主要方法可以做到这一点:

  • 固定帧率:每秒更新屏幕固定次数。在每次更新时,将相机/播放器移动相同的距离。
  • 定时帧 尽可能多地更新屏幕,但要测量迭代之间的时间。移动时,将移动速度乘以自上次更新以来的时间。

在这两种情况下,在处理输入时不要移动角色。相反,当您收到 WM_KEYDOWN 时设置一个 bool 值 playerIsMovingtrue,并在获得 WM_KEYUP 时将其重置为 false。然后仅当变量为 true 时,在生成下一帧时应用移动。

[更新]

看到主循环后:尝试像这样修改它:

修改一:注释掉TranslateMessage。你不需要它,除非你想在你的应用程序中有文本框和类似的东西。

修改 2:添加一个单独的函数来更新世界状态。

do
{
UpdateWorld()
window.displayGL();
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
//TranslateMessage(&msg);
DispatchMessage (&msg);

}while(msg.message != WM_QUIT);

// I won't define exactly all of this, you can get an idea
// what I'm doing by the names. playerIsMoving should be set
// and reset in the `WindowProcedure` when processing 'WM_KEYDOWN/UP':
void UpdateWorld(){
float delta = timeSinceLastCall()
if(playerIsMoving)
player.pos += speed * delta;
}

关于c++ - WM_KEYDOWN 如何处理不同的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23862825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com