0からのゲームプログラミング > プログラムの流れ

Back Next
更新日 2003.10.13
プログラムの流れ

 今までのメルマガの内容だけでは、スケルトンプログラムが何をしているのか、さっぱり分からないかと思います。今回の内容で、プログラムの大まかな流れを押さえておきましょう。


 まずは、WinMain.cpp を見て下さい。そのファイルの最初の方で、
// グローバルオブジェクト & 変数 & ポインタ
と書かれたところを探して下さい。このプログラムでは、新たに宣言したグローバルな変数とかポインタは、そこに書かれてあるのがすべてです。その中で、一つだけクラスのオブジェクトを以下のように宣言しています。
 

CApplication	g_Application;

 ですから、最初に CApplication クラスのコンストラクタ が呼ばれます。今度は、Application.cpp を見て下さい。そのファイルでは、 CApplication クラスのコンストラクタを実装しています。主にやっている内容は、DLL (Dynamic Link Library) [*.dll] をロードして、DLL 内の関数のアドレスを取得しています。この部分は、特に気にする必要はありません。


 今度はまた、WinMain.cpp を見て下さい。今までの Console Application では、main 関数が最初に実行されましたよね。Windows Application では、WinMain 関数が最初に実行されます。そのファイルから WinMain 関数を検索して下さい。その関数の最初の方では、色々と初期化しています。

// アプリケーション に関する初期化
// DirectMusic に関する初期化
// DirectInput に関する初期化


 ウィンドウを作ったり、音を鳴らしたり、キーボードからの入力を簡略化する為の初期化です。自力で最初からプログラムを組む場合は、実はこの部分が非常に面倒くさいのです。この部分を理解する為には、難解な Windows プログラミングの書籍を、最低でも一冊は読む必要があります。もちろん、自分ですべて書けば、もっと柔軟に思ったとおりのプログラムを書けることでしょう。


もう少し先に進むと、以下のコードが書かれています。
 

	while(1)
	{
	 …
	}

 『おや?』一見すると、無限ループですね。はい、そうです。終了ボタン(ESCキーや Alt+F4キー)が押されたときに、break により脱出しています。この while の部分は、初期設定では、1秒間に60回繰り返されるように、時間を計測して制御しています。多くのゲームでは、1秒間に60回、画面を描画していることは、ご存知だと思います。つまり、この部分をうまい具合に書き換えてやるとゲームが出来るという訳です。


 さて、while 内をもう少し詳しく見てみましょう。Win32 API の PeekMessage 関数とか GetMessage 関数が使われていて、その if 内で、TranslateAcceleratorTranslateMessageDispatchMessage 関数が使われています。これらの関数を使って、メッセージを取得して送出しています。

 『え?メッセージって何?』という話ですが、ゲーム等のアプリケーションは、Windows 上で動作します。アプリケーションから、Windows に対しては、Win32 API を使いましたよね。Windows からアプリケーションに対しては、メッセージを処理するウィンドウプロシージャ と呼ばれる関数が呼ばれます。メッセージには、例えば、『最大化ボタンが押された。』とか、『再描画の必要がある。』というメッセージがあります。ウィンドウプロシージャは、MainWndProc と定義しています。(WinMain.cpp の下の方に書かれています。名前は自由に付けることが出来ますが、ここでは MainWndProc としています。)


Windows とアプリケーションとのやり取り(イメージ)

 このような何かのイベントが発生(例. 『最大化ボタンが押された。』)して、それに対応して何らかの処理をする方式は、イベントドリブンevent driven) [メッセージドリブンmessage driven)] と呼ばれています。


 while 内の最後の方では、以下のコードが書かれています。
 

	g_pInput->Detect();	// キーボード入力等の検出
	g_pOggVorbis->Move();	// BGM の処理(Fade 関係)

	g_pScreen->Main();	// 各画面へ

 g_pInput->Detect();
を毎フレーム呼び出すことによって、現在どのキーが押されているかといった情報をある変数に格納しています。そして、
 g_pScreen->Main();
内に、これから作成するゲームのコードを書いていきます。繰り返しますが、このメンバ関数が、1秒間に60回呼ばれるようになっています。その内部の処理については、次回ということで。


 ※ アロー演算子->)については、こちらを参照。


 そして、ESC キー等が押されると、while ループから抜け(メッセージの処理は、MainWndProc 関数でされています。)、WinMain 関数が終了します。最終的には、CApplication クラスのデストラクタ (Application.cpp の下の方) が呼ばれ、メモリが解放されます。


 これが大まかなプログラムの流れです。もっと詳しく知りたい方は、その手の専門書を読んで下さい、としか言えません。最低限のメッセージの処理はしていますので、取りあえずこのまま使う場合には、g_pScreen->Main(); 内の処理だけ記述すればゲームは創れますので、他はあまり気にしなくても構いません。


◆初期設定は変更出来ます。
 InitialSetting.h を見て下さい。そこでは、初期設定を変更出来ると便利だと思われるところを記述しています。そこのマクロ定義を変更して、コンパイルすれば簡単に変更出来ます。例えば、以下の "SampleSTG" の文字列をこれから創ろうとしているゲーム名に変更してコンパイルしてみて下さい。そうすると、タイトルバーの文字列が変更される筈です。その他のマクロ定義は、適当に変更してもらって構いませんが、必要なところは、今後取り上げていきます。
 

// ウィンドウ名(タイトルバーにこの文字が表示される)
#define	WINDOW_NAME	TEXT("SampleSTG")

 TEXT() は、単なるマクロです。別に書かなくても構いません。今後一般的になっていくと思われる Unicodeすべての文字を2バイトで表した文字コード)になったときに、プログラムコードの修正を少なくする為に TEXT マクロを使っているだけです。ここでは、Unicode を使っておらず、TEXT マクロは単に無視されますので、書いても書かなくても同じです。


 あと、『グラフィックボードが、ハードウェアT&Lに対応していません。続行することは出来ますが、処理落ちするかもしれません。』と出る環境があるかも知れません。そのメッセージが出る環境ですと、恐らく最新の3Dゲームが処理落ちするのではないかと思います。3Dゲーム作成においては厳しい環境かも知れませんが、出来るところまでやってみましょう。
 そのメッセージが煩わしいので出したくない場合には、InitialSetting.h の HARDWARE_TL_MSG を編集して下さい。

【スポンサード リンク】


Back Next

0からのゲームプログラミング > プログラムの流れ