LAST UPDATE 1998/08/22


『 その10-4 』




 ■ ボールのコントロールについて

 ボールのコントロールはこのゲーム製作において一番複雑な部分である。以前にも書いたが複雑な処理を一度に理解しようとするのは健康に悪い。だからここで少し整理してみる。
    1) ボールがコースに沿って動く
     ・ 通常のブロック上での処理
     ・ ゲートを通過している時の処理
    2) 次のブロックに乗り移る
     ・ コースがつながっていた場合
     ・ 行き先がなかった場合(Game Over)
     ・ 全ゲートを通過していた場合(Stage Clear)
それではまず(1)についてコードを製作していくことにする。


 ■ ボールの表示座標計算その他

 この部分は長くなりそうなので、サブルーチン化してしまう。Gameというサブルーチンに図のようにエントリー部分を先に作ってしまう。
image138.gif
 Ba.countであるが、これにはBCMAXという値が入れられている。これは定数で32という値が定義されている。
 これはタイマーイベントが32回発生する間にボールが1枚のブロックを通過する。ということを意味している。別の考え方をすると、ボールの移動速度ということにもなる。表示位置はこの値を元に計算されるし、この値が0になったら次のブロックに移動することを意味するし、とても大切な変数なのである。


 ■ GetBallPxyzを作る

 これは、JmainF/General上に作る。
image140.gif
    Dim Bcx!, Bcz!, Rang!, BC!
このサブルーチン内部でのみ使用されるローカル変数を宣言している。それぞれの意味は出現したところで説明していく。
    If (Ba.bno < 20) Then
     BC = BCMax - Ba.count
    Else
     BC = BCMax * 2 - Ba.count
    End If
 Ba.countは通常ブロックの場合32から始まって0になるように減っていく。しかし計算上0~32へと増えてほしい場合がある。ここではその値をBCに入れている。また、このサブルーチンでの座標計算には三角関数なども使われるので浮動小数点型が必要になる。
 Ba.bnoが20以上の値であるということは、ゲート上にボールがあるということを意味している。ゲートは通常ブロック2枚分の大きさなので、Ba.countの初期値はBCMAX*2が入れられる。それでこのような場合分けが必要なのである。
    Bcx = (Ba.bx - 3) * 2: Bcz = (Ba.bz - 3) * 2
BcxとBcyは座標計算時の基準になる座標である。ブロックの中心の座標が格納される。
    Rang = (90 / BCMax) * BC * 3.14159 / 180
(90 / BCMax) * BCで計算されているのは、ボールが0~32のカウンターを元にして動いている値を、0~90度という角度で表した場合の数値を計算している。 BC * 3.14159 / 180は角度で計算された値をラジアンに変換している部分である。 ラジアンと言うのは180°=πという式で計算される値ということになっている。従って変換式は以下のようになる。
Rad=(角度/180)* パイ
 π= 3.141592653...だから
    ラジアン=角度×3.14159 / 180
になるのである。しかし、私はどうもこのラジアンというものが好きになれない。1.57ですと言われてもそれが直角だという実感が沸かないし、直角=90°=1.570796327...で直角という非常にきっちりした値がこのような無限小数という取り止めのない値で表されるのは納得がいかない。私はプログラマーなのでデタラメではあるのだが、直角ぐらいははっきりした数値(例えば1.5とか)で表してほしいものである。
    Select Case Ba.bno
ブロックの種類によってボールのコースが違う。この命令で場合分けしていく。






その 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