SDL_KEYDOWN触发两次

SDL_KEYDOWN triggering twice

我正在关注 lazy foo's tutorial,但是我发现每次按下 sp 时,SDL_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

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


如果您按住某个键的时间足够长,SDL 会生成伪造的重复按键。这主要用于文本输入。

原装按键有.repeat == 0,假按键有.repeat == 1.

可能出于方便的原因(我认为这很不方便),since SDL 2.0.5实际的按键操作会生成两个事件而不是一个。一个 .repeat 设置为 0,另一个(新)设置为 1