0

我尝试使用 SDL_GetTimer() 在使用这段代码通过 1000 毫秒后采取行动:

while(1)
{
    int tajmer;
    int czas = SDL_GetTicks();
     tajmer = SDL_GetTicks() - czas;
        if(tajmer > 1000)
        {
        MoveUp();
        czas = SDL_GetTicks();
        }
}

但这会导致我的程序崩溃。任何想法为什么或如何正确实现简单的计时器?

4

2 回答 2

1

每次循环运行时,czas 都会更新为当前时间。解决方案:将其移出循环。

int czas = SDL_GetTicks();
while(1)
{
    int tajmer;
    tajmer = SDL_GetTicks() - czas;
    if(tajmer > 1000)
        {
        MoveUp();
        czas = SDL_GetTicks();
        }
}

但是,您尝试完成的工作可能会使用内置计时器以更好的方式完成: http ://wiki.libsdl.org/SDL_AddTimer

编辑:

使用 SDL_AddTimer 的示例。

Uint32 my_callbackfunc(Uint32 interval, void *param);

int main() {
    ... // don't forget to SDL_Init
    ...
    SDL_AddTimer(1000, my_callbackfunc, NULL);
    ...
}

Uint32 my_callbackfunc(Uint32 interval, void *param)
{
    MoveUp();
    return(1000); // or however long to wait before my_callbackfunc should run.
}

如果您当前正在使用类并且想要调用名为 MoveUp() 的类的方法,那么可能:

class example {
    ...
    void start_moving() {
        SDL_AddTimer(1000, my_callbackfunc, (void*)this);
    }
    ...
    public void MoveUp() {
       ...
    }
}

Uint32 my_callbackfunc(Uint32 interval, void *param) {
    ((example*)param)->MoveUp();
    return (1000);
}
于 2013-10-27T09:06:05.327 回答
0

继续 Yujin Wus 的回答,您也可以这样做。

int timer = 0;
int ticks = SDL_GetTicks();
while(true)
{
    timer += SDL_GetTicks() - ticks;
    ticks = SDL_GetTicks();
    if(timer >= 1000)
    {
        timer -= 1000;
        MoveUp();
    }
}

或类似的东西

const int DELAY = 1000;
int timer = SDL_GetTicks() + DELAY;
while(true)
{
    if(timer - SDL_GetTicks() <= 0)
    {
        timer += DELAY;
        MoveUp();
    }
}
于 2013-10-27T09:44:56.540 回答