Romen
Romen

Reputation: 103

Simple SDL_GetTimer() usage - why isn't it working?

I've tried to use SDL_GetTimer() to make action after passing 1000ms using this piece of code:

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

But it causes my program to crash. Any ideas why, or how to implement simple timer correctly?

Upvotes: 0

Views: 552

Answers (2)

Yujin Wu
Yujin Wu

Reputation: 58

Every time the loop runs, czas is updated to the current time. Solution: Move it out of the loop.

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

However what you are trying to accomplish could possibly be done in a better way using built in timers: http://wiki.libsdl.org/SDL_AddTimer

Edit:

Example using 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.
}

If you are currently using classes and want to call a class's method called MoveUp() then perhaps:

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

Upvotes: 1

Bozemoto
Bozemoto

Reputation: 226

Continuing on Yujin Wus answer you can also do something like this.

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

Or something like this

const int DELAY = 1000;
int timer = SDL_GetTicks() + DELAY;
while(true)
{
    if(timer - SDL_GetTicks() <= 0)
    {
        timer += DELAY;
        MoveUp();
    }
}

Upvotes: 0

Related Questions