アプリケーション開発論[第4回]
■ イベントドリブン対応のアプリ
前回までの知識では、dos上やゲーム機上のアプリは作ることができますが、windows上のアプリを作ることはできないでしょう。windows上で同じコードを書いてもフリーズしてしまうだけです。windowsではもっと工夫が必要なんです。DirectXSDKのサンプルでも使われているシンプルなもので、僕も気に入っているのは以下のようなコードです。
WinMain()
{
/* 初期化処理 */
while (TRUE) {
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
if (msg.message == WM_QUIT) {
break;
}
/* メッセージ処理 */
}
else {
/* ゲーム処理 */
}
}
/* 終了処理 */
}
このように、メッセージの有無でwindowsアプリとしての動作か、ゲームとしての動作かを振り分けるのです。ここで注目したいのがPeekMessageであることです、GetMessageだと、メッセージがない間アプリがスリープしてしまう(止まる)のでゲーム処理を行えなくなります(リアルタイムでなくなる)。詳しい動作はマニュアルでも見てください。メッセージがある間はそちらの処理を優先的に処理し、なくなったときに初めてゲーム処理に入ることができます。WM_QUITの文を入れないとアプリが終了しません。細かい処理は、DirectXSDKのサンプルなんかを読めば大体の処理はわかるでしょう。
ゲーム専用の処理をしている間もアプリに対してメッセージがポストされます。だから、ゲーム専用処理を優先させてしまうとメッセージが溜まりっ放しになってしまって、ウィンドウが移動できなかったり、メニューが選択できなかったりする現象が起こります。そんな現象を起こさないためにもWindows上ではメッセージ優先型で骨格を組んだほうがいいです。ちなみに僕は、タイマ割り込みでの描画は、あまり好きじゃないです。
- 2000年3月10日 -