解决SDL2按键检测不一致的问题

Resolving inconsistent SDL2 key press detection?

本文关键字:不一致 问题 检测 SDL2 解决      更新时间:2023-10-16

我正在尝试使用SDL_Event系统检测何时按下某个键。我使用这个代码来检测按键:

void GameLoop::update(SDL_Event eventHandler, Camera &camera){
Vector2 move = Vector2();
if (eventHandler.type == SDL_KEYDOWN){
switch (eventHandler.key.keysym.sym){
case SDLK_w:
move = Vector2(0, -1);
break;
case SDLK_s:
move = Vector2(0, 1);
break;
case SDLK_a: 
move = Vector2(-1, 0);
break;
case SDLK_d: 
move = Vector2(1, 0);   
break;
}
}
camera.translateCamera(move);
}

如果我将"WASD"输入切换为"UP DOWN LEFT RIGHT",系统会工作,如果我删除线路:

if (eventHandler.type == SDL_KEYDOWN){

它的工作原理是SDL_KEYUP类型,使用"WASD"或"UP DOWN LEFT RIGHT">

造成这种行为的原因是什么?如何解决?

SDL确实会检查是否按下了键盘,只是碰巧程序读取速度比实际按下的速度快,这会导致多次按下,我不确定你的上、下、左、右按钮,也许它们是SDL读取的,但它们的物理连接可能与键盘中的字母不一样。

现在,如果你把KEYDOWN改成KEYUP,它会读到的只是如果它是向上的,这不是很好。

你想做的是使用布尔值和勾号

if (eventHandler.type == SDL_KEYDOWN && !clicked){
ticking2 = SDL_GetTicks();
switch (eventHandler.key.keysym.sym){
case SDLK_w:
clicked = true;
break;
case SDLK_s:
clicked = true;
break;
}
}
if (eventHandler.type == SDL_KEYUP && clicked){
ticking = SDL_GetTicks();
switch (eventHandler.key.keysym.sym){
case SDLK_w:
if(ticking-ticking2 >= 3000)
{
move = Vector2(0, -1);
clicked = false;
}
break;
case SDLK_s:
if(ticking-ticking2 >= 3000)
{
move = Vector2(0, 1);
clicked = false;
}
break;
}
}

按下一个按钮,它就会获得时间并将其推入ticking2,但在点击后,它会将点击的bool变成true,然后使它停止读取循环,从而冻结ticking2的值。

释放按钮后,它会检查单击是否为真,以便只有在实际按下按钮时才会执行操作。它得到时间并将其推到滴答作响,ticking-ticking2应该等于0左右,我做这些是为了确保效果不会是即时的,因为它可能会导致一些故障。