2013-10-27 45 views
0

我試着使用SDL_GetTimer()通過使用這段代碼1000毫秒後進行動作:簡單的SDL_GetTimer()用法 - 爲什麼它不起作用?

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

但它會導致我的程序崩潰。任何想法爲什麼,或如何正確實現簡單的計時器?

回答

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

如果您正在使用的類和要調用一個類的方法被稱爲上移(),則可能是:

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這不是問題,因爲Bozemoto的方式似乎正在工作(當然,並非如我所料,但仍然; D)。 順便說一句:我聽說過SDL_AddTimer,甚至試圖使用它,但我想我太愚蠢了,所以這是我的要求:你能告訴我如何使用計時器1秒後「MoveUp()」? :D – Romen

0

繼續對鬱金吳家回答你也可以做這樣的事情。

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

謝謝。你的解決方案在某種程度上起作用,但問題是我必須不斷移動鼠標才能「執行」它; D我相信這是我的程序錯誤。 – Romen

+0

嘗試並在鍵盤上按下時觀察它是否更新。如果是這樣,這是因爲事件隊列需要其中的元素具有更新時間的元素。奇怪的錯誤,如果是這樣的話。 – Bozemoto

+0

是的,你說得對。 SDL_PushEvent不斷推出一個活動似乎有效,但我相信這不是最聰明的解決方案。再次感謝。 – Romen

相關問題