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

时间:2015-04-28 21:29:42

标签: c++ keyboard sdl sdl-2

我正在尝试使用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'输入到“向上向下左右”'系统有效,如果我删除该行:

if (eventHandler.type == SDL_KEYDOWN){

它的工作原因是SDL_KEYUP类型,使用' WASD'或者“向下左右”'

导致此行为的原因是什么以及如何解决?

1 个答案:

答案 0 :(得分:-1)

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,然后使其停止读取循环,从而冻结滴答2的值。 / p>

释放按钮后,它会检查点击是否为真,这样只有在实际按下按钮时才会进行操作。 它得到时间并将其推入滴答滴答,滴答滴答滴答2应该等于0左右,我做了那些以确保效果不会立即发生,因为它可能会引起一些故障。