■ 新・ゲーム開発講座




■ へっぽこプログラミング入門♪


■第2夜:フルスクラッチスケルトン

前回コンパイルした test1.cpp は、窓を開くだけで他には何もできないプログラムでした。余計なものを省いて、プログラムとして成立する最低限の骨格だけしか記述していませんので当然と言えば当然です(笑)。このような骨格プログラムを「スケルトン」と呼びます。コンパイラにお任せで作ってしまうと盛りだくさんでゴージャス?なものになりがちですので、ここは手書きで簡素に行きたいと思います。ただし、最低限の記述とは言っても、キャプションバーのボタンを押せば最大化/最小化したり終了できたり・・・というWindowsシステムの恩恵は受けることができます。

なお、第1夜の後半を飛ばして来た方、あるいは直接この章を参照されている方は、スケルトンtest1.zip を解凍して、VC++でコンパイルしてみてください。

べつにこのスケルトンの記述内容をを丸暗記する必要はありません。どこを改造すれば(あるいは付け足していけば)良いのかが分かれば実用上の問題はありませんし、そもそも最少構成のスケルトンは誰が書いてもほとんど同じ内容になります。

さて、では test1.cpp の中身を見ていきましょう。このスケルトンは3つの関数で構成されています。


void Mainloop() メインループ(ここを拡張してゲームを作る)
LRESULT WndProc() イベントハンドラ(キー入力などの処理)
APIENTRY WinMain() エントリポイント(ここから実行開始)


このうち、Mainloop() は後日の拡張のために WinMain()から分離したループ処理部分です(ですから test1.cpp ではまったくの空っぽです)。WndProc()はキー入力その他のイベント処理部分、WinMain()はプログラム起動時の初期化とメッセージループ処理を担当します。それぞれの働きをイメージ的に表現すると、下図のようになります (細かいことは無視して、まあこんな感じなんだなーと思って頂ければ結構です)



図をよく見ると、イベント処理(キー入力など)をさばく WndProc() は、
WinMain() から直接呼ばれていないことが分かると思います。単純なDOS用プログラムと違って、Windowsではイベント処理を担当する関数(test1.cppではWndProc())を起動時に登録しておいて、あとはWindowsのシステム内を飛び交ってる各種イベントメッセージのうち自分のウィンドウに関連するものだけを WndProc()に横流しして処理する、という構図になります。このイベント処理を行う関数をイベントハンドラと呼びます。Windowsのシステムはそれ自体が巨大なループ処理の塊です。アプリケーションはこの巨大なループから、瞬間的に実行権をもらっては返却し、もらっては返却し・・・ということを繰り返して動作しています。

メッセージ処理が行われない場合は、Mainloop() がひたすら繰り返し呼び出される構造になっています。ジェット戦闘機の「タッチ&ゴー」みたいな動作だと思っていただければ良いと思います。逆に言うと、ここであまりにも長時間を要する処理を記述してしまうと、プログラムそのもののレスポンスが下がってしまうことにもなります(場合によってはハングアップのような状態になることも ^^;)。その意味では、遅延処理やループ処理のようなものは記述方法を工夫する必要がありそうですね。実際、その通りです。

次回以降、もう少しスケルトンの内容を詳しく見ていきましょう。