『 その11-4 』
■ ゲートの表示を追加する ![]() 追加先はJmainF/General/Gameというサブルーチン内である。ボールの表示処理の前にコードを書く。
………・ End If
|
■ ボールがブロックを通過した時の処理 ![]()
Ba.bz = Ba.bz + Int(Ba.vz + 0.5) 理論上はこの時点で、vxとvzには-1か0か+1のどれかが入っているはずである。しかし値は三角関数を使って計算される。角度をラジアンに変換する際にπであるべきところを3.14159という近似値を使って計算しているために、90度であるべきところが正確に90度でなかったりして、vxとvzには-1か0か+1に近いが正確にはちょっと違う数値が入っている場合がある。Ba.bxやBa.bzは配列の場所指定に使われる変数なので、値は整数でなければならない。 そこでInt(Ba.vx + 0.5)という数式が使われる。これは古典的な四捨五入のテクニックで小数点以下1桁を四捨五入している。 例えばBa.vxの値が0.49だったとしよう。0.49+0.5=0.99だからそのIntの値は0になる。ではBa.vxの値が0.51だったとした場合が0.51+0.5=1.01でIntの値は1になる。このようにして浮動小数点演算で発生した誤差を取り除いているのである。
これについては後で詳しく説明する。
どんな場合かというと、例えば5番のブロックは下と右にのみ出入り口を持っているが、このブロックに上や左から入ろうとしている場合などである。 ![]()
Ba.count = BCMax - 1 Else Ba.count = BCMax * 2 - 1 End If
X軸回転とは前後に回す回転である。ボールが手前から奥もしくはその逆に転がっている場合にボールの進行方向ベクトルであるBa.vzは1か-1になっているし、左右に転がっている場合は0が入っている。ボールが横に動いている場合に前後に回転してはいけない。ということで、X軸回転にはvzを掛け、Z軸回転にはvxを掛けてやればボールはちゃんと進行方向通りに回転するわけである。
|
その 11-1 |
その 11-2 |
その 11-3 |
その 11-4 |
その 11-5 |
その 11-6
『 サルのゲーム製作講座 』
目次 |
その 1 |
その 2 |
その 3 |
その 4 |
その 5 |
その 6 |
その 7 |
その 8 |
その 9 |
その 10 |
その 11
e-mail: sc_3da@magical2.egg.or.jp