SDL_KEYDOWN触发两次

时间:2017-06-20 23:03:36

标签: c++ sdl-2

我正在关注lazy foo's tutorial,但每次按下spSDL_KEYDOWN触发两次,我就会意识到这一点。如何解决这个问题?

以下是代码段:

while(SDL_PollEvent(&e) != 0) {
    if(e.type == SDL_QUIT) {
        quit = true;
    }
    else if(e.type == SDL_KEYDOWN) {
        if(e.key.keysym.sym == SDLK_s) {
            if(timer.isStarted()) {
                timer.stop();
                printf("stop\n");
            }
            else {
                timer.start();
                printf("start\n");
            }
        }
        else if(e.key.keysym.sym == SDLK_p) {
            if(timer.isPaused()) {
                timer.unpause();
                printf("unpause\n");
            }
            else {
                timer.pause();
                printf("pause\n");
            }
        }
    }
}

s一次:

start
stop

1 个答案:

答案 0 :(得分:2)

TL; DR:在处理事件之前,检查e.key.repeat是否等于0

如果您持有足够长的钥匙,SDL会生成假的重复按键。这主要用于文本输入。

原始按键有.repeat == 0,虚假按键有.repeat == 1

为了方便起见,可能(我认为它相当不方便),since SDL 2.0.5实际按键生成两个事件而不是一个。其中一个.repeat设置为0,其他(新)一个设置为1