Я попытался использовать SDL_GetTimer(), чтобы выполнить действие после прохождения 1000 мс с помощью этого фрагмента кода:
while(1)
{
int tajmer;
int czas = SDL_GetTicks();
tajmer = SDL_GetTicks() - czas;
if(tajmer > 1000)
{
MoveUp();
czas = SDL_GetTicks();
}
}
Но это приводит к сбою моей программы. Любые идеи, почему, или как правильно выполнить простой таймер?
Каждый раз, когда цикл работает, 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);
}
Продолжая ответ 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();
}
}