メインループのかきかた


 ゲームプログラミングについて書いてほしいという要望があったので
とりあえずこんなところから始めてみます。

・TTimer

 まずは、TTimerを使用したサンプルです。

  Delphi2,3用ソースのみmloop1.lzh(31.6kbyte)

 こんな感じの処理はMouse Gunで使われています。
 まあ、メインループだけというのはあまり意味がないのでキーボード入力と
Joystick入力とTImageをつかった簡単なスプライト処理が入っています。
スプライト処理については七☆星さんのページ を参考にしました。

・Multimedia TimerとMultiThread

 TTimerは精度がよくないのでMultiMedia Timerをつかったものも載せておきます。
尚、このプログラムをコンパイルするにはDycoonGコンポーネントが必要です。
実行にはDirectX5が必要です。

  Delphi4用(多分D2でもOK)ソースのみmloop2.lzh(129kbyte)
   0:17 00/08/18修正 多分バグが減ったと思う

さすがにTTimer程は楽にプログラミングはできません。
MultiMedia Timerはどうも別スレッドが生成されて動くようです。
だから、そのままMultiMedia TimerのイベントのところでTImageなどに
アクセスしようとするとApplicationが止まります。

ということでMultiMediaTimerではJoyStick入力のCheckとスプライトの移動をしています。
でも、キーボード入力はMultimedia Timerの中からでは調べられないようなので
結局TTimerをつかって定期的に取らせています。

この方法はあまりいい方法でなく、本当はOnKeyDownやOnKeyUpのところで
押されたキーを調べてそれをGlobalな変数にでもとっておいて
Multimedia Timerのところで入力を調べるという方がいいと思います。

描画部分は別にスレッドをつくってそこで描画させることにしました。
これで、マシンが極端に遅い場合でも入力や運動のタイミングがずれにくくなります。

描画にはDycoonGコンポーネントを使いました。
これならばMultiThreadでSynchronizeを呼ばなくても描けるからです。
TImageなどはSynchronizeを呼ばないとApplicatoinが停止します。
まあTBitmapをFormから独立したところにおけばSynchronizeはいらないと思いますが

・著作権情報など

 自由に使ってください。

上へ
目次
GigaHit