C SDL中的按键重复延迟

C SDL中的按键重复延迟,c,timer,keyboard,sdl,C,Timer,Keyboard,Sdl,我试图在按住键盘的同时在菜单中获得键盘延迟效果。目前它可以工作,但在改变方向后不能工作。例如,我可以按住向右键,光标世界向右移动,然后暂停,然后继续向右移动(如预期的那样)。我可以向右释放和按下,或者向右按住,这样就行了。按住左键不起作用,光标立即全速移动。奇怪的是,如果我在那之后松开并按住左键,它就会工作。在这之后按住会立即使光标全速移动,就像上面所说的那样,这只会影响第一次 下面是我正在处理的函数:(许多变量都是全局变量,如果函数中没有声明一个变量,那么它就是全局变量) 这一个根本没有重复。

我试图在按住键盘的同时在菜单中获得键盘延迟效果。目前它可以工作,但在改变方向后不能工作。例如,我可以按住向右键,光标世界向右移动,然后暂停,然后继续向右移动(如预期的那样)。我可以向右释放和按下,或者向右按住,这样就行了。按住左键不起作用,光标立即全速移动。奇怪的是,如果我在那之后松开并按住左键,它就会工作。在这之后按住会立即使光标全速移动,就像上面所说的那样,这只会影响第一次

下面是我正在处理的函数:(许多变量都是全局变量,如果函数中没有声明一个变量,那么它就是全局变量)


这一个根本没有重复。

对于那些可能对这个问题感到困惑的人,我想知道为什么改变方向会有任何影响,因为“count”变量应该是零,这会导致延迟,但不知何故它似乎有一些其他值。(这是让我困惑的部分)我刚刚用底部的
print()
测试了程序,以显示lcount和rcount的值。它们按预期工作,但现在光标始终全速移动。所以我开始认为问题在于下面的if语句
SDL_GetTicks()
int handleEvents() {
    static int lcount = 0;
    static int rcount = 0;
    while(SDL_PollEvent(&e)) {
        if(e.type == SDL_QUIT) end++; //quit code
        if(e.type == SDL_KEYDOWN) {
            switch (e.key.keysym.sym) {
                case SDLK_ESCAPE: end++; break;
                case SDLK_LEFT: lDown = 1; break;
                case SDLK_RIGHT: rDown = 1; break;
            }
        }
        if(e.type == SDL_KEYUP) {
            switch (e.key.keysym.sym) {
                case SDLK_LEFT: lDown = 0; break;
                case SDLK_RIGHT: rDown = 0; break;
            }
        }
    }

    int now = SDL_GetTicks();

    if (lDown && curLocation >  0 && (now-ltime > 1500 || (now-ltime > 250 && lcount>0))) {
        curLocation--;
        lcount++;
        ltime = SDL_GetTicks();
    }
    if (rDown && curLocation < 18 && (now-rtime > 1500 || (now-rtime > 250 && rcount>0))) {
        curLocation++;
        rcount++;
        rtime = SDL_GetTicks();
    }

    if (!lDown) {
        lcount = 0;
        ltime = now - 1500;
    }
    if (!rDown) {
        rcount = 0;
        rtime = now - 1500;
    }

    return 0;
}
int handleEvents() {
    int mouseMotion = 0;
    SDL_EnableKeyRepeat(500, 250);
    while(SDL_PollEvent(&e)) {
        if(e.type == SDL_QUIT) end++; //quit code
        if(e.type == SDL_KEYDOWN) {
            switch (e.key.keysym.sym) {
                case SDLK_ESCAPE: end++; break;
                case SDLK_LEFT: curLocation--; break;
                case SDLK_RIGHT: curLocation++; break;
            }
        }
    }

    return 0;
}