C++ 简单的SDL_GetTimer()用法-为什么不';它不起作用吗?

C++ 简单的SDL_GetTimer()用法-为什么不';它不起作用吗?,c++,timer,sdl,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(); } } 但这会导致我的程序崩溃。知

我尝试使用SDL_GetTimer()在通过1000ms后使用以下代码执行操作:

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

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

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

int czas = SDL_GetTicks();
while(1)
{
    int tajmer;
    tajmer = SDL_GetTicks() - czas;
    if(tajmer > 1000)
        {
        MoveUp();
        czas = SDL_GetTicks();
        }
}
但是,使用内置计时器可以更好地完成您要完成的任务:

编辑:

使用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);
}

继续吴玉瑾的回答,你也可以这样做

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();
    }
}
const int DELAY=1000;
int timer=SDL_GetTicks()+延迟;
while(true)
{

如果(timer-SDL_GetTicks(),谢谢你的回答。事实上,你的解决方案不起作用,它仍然崩溃;但是这不是问题,因为Bozemoto的方法似乎起作用了(好吧,不是我所期望的,但仍然是;D)顺便说一句:我听说了SDL_AddTimer,甚至尝试过使用它,但我想我太笨了,所以我的请求是:你能告诉我如何在1s后使用timer来“MoveUp()”吗?:DThanks。你的解决方案不知怎么行得通,但问题是我必须不断移动鼠标才能“执行”我相信这是我的程序错误。试着看看当你按下键盘时它是否也会更新。如果是这样,那是因为事件队列中需要元素来更新时间。如果是这样的话,那就是奇怪的错误。是的,你是对的。通过SDL_PushEvent推送事件似乎一直在工作,但我相信这不是问题所在martest解决方案,再次感谢。