[] 目次 []

Simple DirectMedia Layer API を使う

タイマー

  • 現在の時間の取得(1/1000 秒単位)

SDL_GetTicks() は過去の任意の時点から経過した時間を 1/1000 秒単位で答えます。

Tip:
一般にゲームを実装するときは、フレームレートよりも時間に基づいて ゲーム内でオブジェクトを動かした方がよいです。 これにより速いシステムと遅いシステムとの間でゲームプレイの整合性が取れます。
サンプルコード:
#define TICK_INTERVAL    30

Uint32 TimeLeft(void)
{
    static Uint32 next_time = 0;
    Uint32 now;

    now = SDL_GetTicks();
    if ( next_time <= now ) {
        next_time = now+TICK_INTERVAL;
        return(0);
    }
    return(next_time-now);
}
  • 指定された1/1000 秒単位の時間の待機

SDL_Delay() によって 1/1000 秒単位の時間で待つことができます。

SDL がサポートしている OS はマルチタスクなので、 要求された時間通りに正確にアプリケーションが 遅れることを保証する方法はありません。 これはある特定の時間に起こすよりも、 しばらくアイドリングする方法として使われるべきです。

Tip:
たいていの OS には、約 1/100 秒単位のスケジューラのタイムスライスがあります。 CPU に現在のタイムスライスをあきらめさせ、他のスレッドの実行を許す方法 として SDL_Delay(1) を使うことができます。 これはきちきちのループ内にスレッドがあるが、 他のスレッド(オーディオのように)も実行し続けたい場合に重要です。
サンプルコード:
{
    while ( game_running ) {
        UpdateGameState();
        SDL_Delay(TimeLeft());
    }
}
 

[] 目次 []