VisualBasic 2015 入門
29.突破4 当たり判定
今回は [ 突破3 初期化とクリックイベント ] の続きです。
ゲームの開発をしていて一番わくわくするのが当たり判定です。
なぜかと言うと、絵を表示して動かすだけのプログラムに
当たり判定を入れると、世界を構築している感じが出てくるからです。
例えばレースゲームを思い浮かべてください。
当たり判定がなければ、他の車に当たっても、壁に当たってもすり抜けてしまいます。
ゲームの初期化を用意しよう
これからの作業のためにゲームの初期化サブルーチン Game_init を用意します。
プログラムを次のように変更してください。
Form1_Load にあったプレイヤーの初期化 Player_init は、
ゲームの初期化の中に入れます。
処理の流れは次のようになります。
ゲームの初期化は文字通り初めとゲームオーバーのあとのリトライ時に行うことになります。
どんなゲームでも大抵は初期化が必要になるので、
あらかじめ作ってしまうのがいいでしょう。
当たり判定を入れよう
プレイヤーとすき間を使って当たり判定を入れます。
くわしい説明はあとでしますから、まずプログラムを変更してください。
実行してみましょう。
初めは壁に当たらないように、すき間を狙って発射します。
すき間を抜けて画面上まで移動すると思います。
次は壁に当たるように発射してください。
壁とプレイヤーが当たると、動きが止まることを確認してください。
動きを止めているのは Player_move と Sukima_move の中に入れた hitFlg 判定です。
当たった時 hitFlg を True にしているので条件文に引っ掛かり
サブルーチンを抜けるようになります。
ゲームの初期化 Game_init の中で hitFlg を False にすることを忘れないように
しましょう。
ゲームの初期化の役割は、すべてをリセットすることですから。
当たり判定のしくみ
当たり判定をしているのは、たったの2行です。
1行目では、Y軸の重なりを見ています。
Sukima.Top+sH よりも Player.Top が小さく、
Sukima.Top よりも Player.Top+pH が大きければ、
重なっている(当たっている)ことになります。
すき間と壁の位置や高さは同じなので、この条件が満たされたときは
プレイヤーと壁が重なる(当たっている)可能性がある訳です。
Y軸が重なっているなら、あとはX軸を調べるだけです。(2行目)
Sukima.Left よりも Player.left が小さいなら左にはみ出していることになり
Sukima.Left+sW よりも Player.Left+pW が大きければ右にはみ出している
ことになります。
はみ出している、すなわち、壁と当たっていることになります。
ちなみに、壁の中に複数のすき間がある場合には、この当たり判定は使えません。
その時は、壁との重なりを1つ1つ判断する必要があります。
ゲームオーバーを表示しよう
当たり判定が入ったのでゲームオーバーを表示しましょう。
ラベルを使って「 GAME OVER 」を作りましょう。
ここは好きなように作ってください。
下の画像ではプロパティを4箇所変更しています。
このラベルをプログラムで使用するため名前を変更しましょう。
name プロパティを Gameover にします。
プログラムを変更します。
初期化の中で隠し、当たり判定の中で表示します。
実行してみましょう。
壁に当たるとゲームオーバーが表示されて、ゲームらしくなってきました。