メインループのかきかたゲームプログラミングについて書いてほしいという要望があったので とりあえずこんなところから始めてみます。 ・TTimerまずは、TTimerを使用したサンプルです。Delphi2,3用ソースのみmloop1.lzh(31.6kbyte) こんな感じの処理はMouse Gunで使われています。 まあ、メインループだけというのはあまり意味がないのでキーボード入力と Joystick入力とTImageをつかった簡単なスプライト処理が入っています。 スプライト処理については七☆星さんのページ を参考にしました。 ・Multimedia TimerとMultiThreadTTimerは精度がよくないので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はいらないと思いますが ・著作権情報など自由に使ってください。目次 |