Простое использование SDL_GetTimer () - почему это не работает?

0

Я попытался использовать SDL_GetTimer(), чтобы выполнить действие после прохождения 1000 мс с помощью этого фрагмента кода:

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

Но это приводит к сбою моей программы. Любые идеи, почему, или как правильно выполнить простой таймер?

Теги:
timer
sdl

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);
}
  • 0
    Спасибо за ответ. На самом деле, ваше решение не работает, оно все равно дает сбой; D Это не проблема, потому что способ Боземото, кажется, работает (ну, не так, как я ожидал, но все же; D). Кстати: я слышал о SDL_AddTimer и даже пытался использовать его, но я полагаю, что я слишком глуп, поэтому вот мой запрос: не могли бы вы сказать мне, как использовать таймер для «MoveUp ()» после 1 с? : D
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();
    }
}
  • 0
    Благодарю. Ваше решение работает каким-то образом, но проблема в том, что мне приходится постоянно двигать мышью, чтобы «выполнить» его, хотя я считаю, что это ошибка моей программы.
  • 0
    Попробуйте и посмотрите, обновится ли он, когда вы нажимаете на клавиатуре. Если так, то это потому, что в очереди событий нужны элементы, чтобы в ней были элементы для обновления времени. Странная ошибка, если это так.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню