LAST UPDATE 1998/08/22


『 その10-3 』




 ■ タイマーイベント

image136.gif
 タイマーイベントが発生した場合のコードは右のようになる。簡単なので説明はしない。


 ■ Gameというサブルーチン

 ここでは、ブロックが動く処理、ボールが動く処理、ゲートが裏返る処理の3種類が必要になる。まずはブロックの処理を作る。これらサブルーチンは、JmainBに置いてもかまわないのだが、私はJmainF/Generalに配置した。
image137.gif

    If (Mjob <> -1) Then
 Mjob=-1の場合、ブロックは動いていない。
    Select Case BlkDir
 キーコード処理で格納したBlkDirの内容によって処理を分岐させる。
    Call Move_A _
     (CBlk, _
     (Ex - 3) * 2, 0, _
     (Ez - 4) * 2 + Mjob * 2 / 3)
 ブロックの画面内での座標を計算し、与えている。最初Mjobの値は2を与えられる。これはこの処理が終わった後で1になり0になりそして-1になって処理が終わる。
 Mjob * 2 / 3は、ブロックはMjobの値によって、3回のタイマーイベントを経て移動が終了するための計算式である。
pic10_0.gif
 なぜこのようにブロックを目的位置まで段階的に移動させるかというと、瞬間移動させるとブロックが動いているのではなく、空白が動いているように見えてしまうからである。大昔にメガドライブ用に作った元祖Junctionはそうであったのだが、スムーズに動かすと見栄えは良くなるものの、今度はプレイしていて動きが重く感じるようになってしまう。ここらへんのバランスがゲーム製作の難しいところで、例えば物が動くということは本来であれば絶対に慣性重量からは逃れられないわけで、考慮に入れた方が動きはリアルになるのだが、格闘ゲームなどの場合これを考慮に入れると今度は、「動きが重い」とか、「爽快感がない」などと非難される操作性になってしまう。難しい問題である。ということで、今回はその間をとって3段階で移動は終了することにしてあったりする。
    If (Bmflg = 1) Then Call Move_R(Ball_ID, 0, 0, Mjob * 2 / 3)
これは動かしたブロックの上にボールが乗っていた場合の処理である。ここで相対移動系の_Rを使っているのは、ボールのコントロールを作った後で、計算された座標にブロックの移動分を相対的に加えてやろうというずるい考えからである。

 以下同様ということで、ブロックの移動方向が違う場合のコードを下に示すが、最後の方のMjob=Mjob-1という部分に注意すること。

image134.gif

 ■ 動作チェック

 ここらへんで動作チェックである。コースが表示されたら矢印キーを押してみよう。ちゃんとブロックが動くかどうかを調べるのである。だんだんとゲームっぽくなってきたはずである。







その 10 -1 | その 10-2 | その 10-3 | その 10-4 | その 10-5 | その 10-6 | その 10-7

『 サルのゲーム製作講座 』 目次 | その 1 | その 2 | その 3 | その 4 |
その 5 | その 6 | その 7 | その 8 | その 9 | その 10 | その 11


もどる

e-mail: sc_3da@magical2.egg.or.jp