第二章「実戦!SDLでゲーム作り@〜某宇宙人〜」第九話


前回までのサンプルでは、動作させるPCによっては、処理速度が違いました。
しかし、ゲームというのは、ある程度理想の処理時間があり、PCによって速度が違うのは困りものです。

そこで、今回は速度の統一化をしてみたいと思います。

使うのは、メインループの周回時間で、毎回メインを通るたびに現在時刻を取得して計算させます。 そして、その経過時間をつかって、希望の処理時間まで待機させるということです。

実際に現在時刻を取得する方法です。

SDL_GetTicks();

これは現在の時刻をUint32形の整数にして取得することができます。
時刻は、1/1000秒(1ミリ秒)です。

以前SDL_Delayを紹介したとき、引数の数字はきちんと解説しませんでしたが、
SDL_Delayの引数も、1ミリ秒単位の待機として指定します。
しかし、普段1秒以下の数字を使うときは、絵のように、1/60秒を基準にすることが多いですよね。
そうするときは、1秒=1000ミリ秒なので、1000/60ミリ秒と指定すればいいですね。

この二つをうまく利用して、上の絵のようなシステムを作りたいと思います。






Game.hにvoid Wait(void);を追加
Main.cppの追加ソース

メインループのSDL_Delay()をWait();に直す。 void Wait() { static Uint32 preCount; //前回の時間を保存する変数 float WaitTime = 1000.0f / 60; //1000=1秒で、1秒間に60週したい。(希望速度) Uint32 WaitCount = (Uint32)( WaitTime + 0.5f ); //float形をUint32形に変換。小数点以下の四捨五入(+0.5f) if( preCount ) //初回はこの処理をしない。 { Uint32 nowCount = SDL_GetTicks(); //現在の時刻を取得。(1/1000秒単位) Uint32 Interval = nowCount - preCount; //現在の時刻から前の時刻を引く=経過時間。 if( Interval < WaitCount ) //経過時間が希望速度より小さい場合(速い場合) { Uint32 DelayTime = WaitCount - Interval; //希望時間までに必要な残りの時間を計算。 SDL_Delay( DelayTime ); //必要な残り時間のみを休憩させる。 } }else{ SDL_Delay(1000); //初回のみ一秒待機させてみた。 } preCount = SDL_GetTicks(); //現在の時間を次回に使用するために取得する。 }



〜〜第十話へ〜〜