0

このコードを使用して、1000ミリ秒を経過した後にSDL_GetTimer()を使用してアクションを作成しようとしました:

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

しかし、それは私のプログラムをクラッシュさせます。シンプルなタイマーを正しく実装する理由、または方法はありますか?

4

2 に答える 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);
}
于 2013-10-27T09:06:05.327 に答える