简单的SDL_GetTimer()用法 - 为什么它不起作用?

时间:2013-10-27 08:56:59

标签: c++ timer sdl

我尝试使用SDL_GetTimer()在使用这段代码传递1000ms后执行操作:

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

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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();
    }
}