アプリケーション開発論[第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日 -

[戻る]