TOP > VBでゲーム作っちゃる > 技術 > [VB6]ループの使い分け

[VB6]ループの使い分け

VB6での全体の処理形態(処理の進め方)には、大きく分けてイベントドリブンゲームループがあることを説明しました。

では具体的にどちらを用いるのが適切なのか考えてみましょう。

例えば、Windows標準添付のソリティアやマインスイーパは、ユーザがクリックした時にカードを動かしたりマスを開けたりします。これらはクリックという操作(イベント)に対応して処理が実行されていることになり、イベントドリブンと言えます。一般的にはカード・パズル・タイピングなどはイベントドリブンと言っても問題ないかと思います。

ゲームループといえば、常に描画しつづけているようなゲーム、ユーザのキー操作に敏感に反応する必要があるゲームなどに好まれます。シューティング・アクションなどは勿論のこと、エフェクトが豪華になった最近ではほとんどがこちらの形式を採用しているのではないでしょうか。

イベントドリブンの場合、ユーザの操作に対応できるとはいえ、場合によっては厄介なこともあります。例えばキーが押すとキャラクタを移動させ、移動後の場所で描画する場合を考えます。移動処理を終えてキャラクタを描画している最中に、次のキー入力が発生してしまったとします。描画処理にてイベントを受け付ける隙間(DoEvents)を用意した場合、1つ目の描画が完了する前に次の移動処理が実行されてしまいます。こうなるとキャラクタが移動した位置と描画された位置が異なることになりかねません。あるいは連続して移動処理が優先されて、描画できたときには全然違う場所まで飛んでいったように描画されるかもしれません。(いわゆるコマ落ちの状態になる)

だからといって隙間(DoEvents)を取り除くと、処理中はアプリケーションの制御が出来なくなるので、システムとしてあまりよいものとはいえません。「デモ画面が終了するまでウィンドウを閉じることが出来ない」なんていったらみんな怒るでしょ?

上記で挙げたイベントドリブンでの問題は、処理が発生するタイミングをイベントにゆだねるため、プログラム側が意図するよりも短い間隔で発生することがあるということでした。

このような処理を行う場合はゲームループを使用します。ゲームループの場合は処理の実行間隔をプログラム側が制御するため、この問題は解決できます。つまりプログラム側が処理をしたいと思った時に、アクションが発生しているかどうかを判断し、発生していたら処理を実行するという動作をするからです。

いわゆるFPS(Frame Per Second:単位秒あたりのフレーム数)で管理するのは、このゲームループです。一般的には60FPSで処理するようです。すなわち1秒間に60回の処理を行うということですね。これはディスプレイの更新が1秒間に60回であることからのようです。(リフレッシュレートが60Hzということ)

ちなみに人間の目は0.1秒以下の場合は連続して見えるといわれています。これに従うと10FPSでも連続した動きに見えるということになりますが、実際にはもう少し細かく描画するほうがきれいです。一般にTVの場合は1秒間に30コマありますから、30FPSといえるのでしょうか。

ではいつでもゲームループがいいのかと言うとそうでもありません。ゲームループは当然ループ中は常に処理を続けています。イベントドリブンではイベント処理が終了すると、次のイベント発生まで何もしないことになります。これはCPUの負荷を下げることになります。

例えばパズルなど入力が発生するまで状態が変わらないゲームの場合、無理にゲームループにしてCPUを働かせ続ける必要はありません。こういうゲームは「ながら作業」で遊ばれるものもあります。ゲーム側がPCの能力を全て奪ってしまっては本末転倒ですよね。

またゲームループの処理がややこしいこともあり、お手軽に作成する場合やキーを押す感覚を生かすもの、マウスを使うものなどはイベントドリブンで十分だったりします。

すなわち、どちらの形式でも長所短所がありますから、自分のゲームにあった形式を選ぶ様にしましょう。

※キーを押す感覚はイベントドリブンと書きましたが、当局の見解ではタイピングゲームはイベントドリブン、音楽ゲームはゲームループが適していると考えています。つまり処理方式はゲームの内容にあったものを選ぶようにすべきです。


HOMEこのページの先頭へ    BackSpace入り口に戻る
Copyright(c)GarGer-Studio 2003-2012