SDL_KEYDOWN 触发两次

dru*_*rum 4 c++ sdl-2

我正在遵循lazy foo的教程,但是我意识到每次按下pressspSDL_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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

s一次:

start
stop
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 7

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


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

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

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