どのようなときでも常にゲーム関連の処理を行うとは限りません。ユーザーがポーズを選択するとゲームの進行は停止するはずです。ポーズが解除されるまで待機しておくのがベストだと思われます。このようにすれば、ポーズ中はCPUを使用することはありません。0)DispatchMessage(&msg);elsebreak;}g_bPauseは、WM_KEYDOWNでポーズキーが押されたときに変化するとします。この変数がTRUEであるときはポーズ中です。そのため、GetMessageで待機します。ユーザーが再びWM_KEYDOWNでポーズキーを押したときになります。ゲームの進行を停止するという処理は、ユーザーのウインドウ操作でも起こりうることです。ゲームを進行することは恐らく好ましくないでしょう。このようなときもゲームを続行するべきではないと思われます。0)DispatchMessage(&msg);elsebreak;}g_bLostFocusは、WM_SETFOCUSとWM_KILLFOCUSで変更されます。ゲームの進行を停止させます。実践的なゲームに欠かせないウインドウ関連の処理も充実しています。プロトタイプとして働けるのではないかと思います。バックバッファはCreateCompatibleBitmapで作成しています。実際にはゲームループによって更新されたバックバッファが、何度も描画されています。ゲームループはRunという関数に実装されており、WinMainから呼び出されています。winmm.libのリンクは、マルチメディア関数(timeGetTimeなど)の利用の際に必要になります。BACKBUFFER構造体は、バックバッファの情報を管理します。幅と高さやクリアに使うブラシなども含まれています。この関数内でゲームループが実装されています。dwCurTime);このelse文は、前節で紹介したゲームループでは実装していません。絶対必要というわけではありませんが、CPU使用率を下げる1つの手段になっています。ループを繰り返しています。これは、悪く言えば一種のポーリングであり、CPUの浪費です。その時間になるまで処理を待機するというのが明らかに得策ではないでしょうか。この間にはCPUが使用されることはありません。if文が真になるでしょう。指定したミリ秒経ったとしても、直ぐに制御を返せるとは限らないという点を持っています。どちらにしても、余分に待機してしまう可能性があるということは気に留めておくべきです。続いて、MoveとRender、そしてShowの内部を見ていきます。Move(void){}Moveで行うべきことは、データの更新です。アニメーションなどの処理は一切、行われていません。g_backBuffer.hbr);}Renderで行うべきことは、バックバッファへの描画です。本来ならばMoveで更新したデータを基に、ビットマップを描画したりします。hdc);}Showで行うべきことは、バックバッファをウインドウに描画することです。Showの内部は基本的には変わりません。ウインドウプロシージャですが、まずはg_bLostFocusの変更部分から見てみましょう。0;WM_KILLFOCUSは、ウインドウが最小化した場合や、非アクティブになった場合に送られます。このときは、ゲームの進行を止めるためg_bLostFocusをTRUEにします。WM_SETFOCUSは、ウインドウがアクティブになった場合に送られます。次に、ポーズ処理を見てみます。VK_SPACEなどとして、スペースキーの押下でポーズ処理を行うのもよいでしょう。呼び出さなかったらどうなるのかを考えてみましょう。この状態でウインドウを最小化したとします。最小化前の内容と異なることがあります。再描画が新しいバックバッファの描画として機能してしまったからです。新しいバックバッファは、MoveとRenderによって作成されることになります。ゲームの進行が停止しているときでも呼ばれる可能性があるということです。この1つの例が、先に述べたポーズ時での再描画の発生です。ゲームの進行が停止した瞬間にShowを呼び出すことによってこれを回避するのです。似たような処理が、WM_NCLBUTTONDOWNでも行われています。WM_NCLBUTTONDOWN:Show();break;WM_NCLBUTTONDOWNは、非クライアント領域(タイトルバー等)を押したときに送られます。ウインドウはディスプレイの外に移動するかもしれません。このようなときはWM_PAINTが発行されるので、先ほどのポーズと同じ現象が起こりえます。そのため、ゲームの進行が停止した瞬間にShowを呼び出すのです。0;WM_ERASEBKGNDは、ウインドウに無効領域が発生したときに送られます。塗りつぶされることはありません(PAINTSTRUCT構造体のfEraseがFALSEになる)。次のような現象が発生します。自作のウインドウをアクティブにしたとします。一時的にバックバッファの一部が白くなってしまったわけです。背景色のブラシとしてNULL_BRUSHを選択する方法が考えられます。プログラムでは念を入れて、両方の処理を行っています。今回で、ゲームループを利用したプログラムの説明は終了です。簡単なアニメーションを行うプログラムを作成してみます。