初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

VisualBasic 2015 入門

29.突破4 当たり判定

 

今回は [ 突破3 初期化とクリックイベント ] の続きです。

ゲームの開発をしていて一番わくわくするのが当たり判定です。
なぜかと言うと、絵を表示して動かすだけのプログラムに
当たり判定を入れると、世界を構築している感じが出てくるからです。
例えばレースゲームを思い浮かべてください。
当たり判定がなければ、他の車に当たっても、壁に当たってもすり抜けてしまいます。

 

 

ゲームの初期化を用意しよう

これからの作業のためにゲームの初期化サブルーチン Game_init を用意します。
プログラムを次のように変更してください。
Form1_Load にあったプレイヤーの初期化 Player_init は、
ゲームの初期化の中に入れます。

 

初期化をゲーム用とプレイヤー用に分ける

 

 

処理の流れは次のようになります。

 

ゲームの流れ

 

ゲームの初期化は文字通り初めとゲームオーバーのあとのリトライ時に行うことになります。
どんなゲームでも大抵は初期化が必要になるので、
あらかじめ作ってしまうのがいいでしょう。

 

 

当たり判定を入れよう

プレイヤーとすき間を使って当たり判定を入れます。
くわしい説明はあとでしますから、まずプログラムを変更してください。

 

vb 当たり判定を入れたプログラム

 

 

実行してみましょう。
初めは壁に当たらないように、すき間を狙って発射します。
すき間を抜けて画面上まで移動すると思います。
次は壁に当たるように発射してください。
壁とプレイヤーが当たると、動きが止まることを確認してください。

 

vb 当たり判定を入れた

 

 

動きを止めているのは Player_move と Sukima_move の中に入れた hitFlg 判定です。
当たった時 hitFlg を True にしているので条件文に引っ掛かり
サブルーチンを抜けるようになります。

 

vb 動きを止める

 

ゲームの初期化 Game_init の中で hitFlg を False にすることを忘れないように
しましょう。
ゲームの初期化の役割は、すべてをリセットすることですから。

 

 

当たり判定のしくみ

当たり判定をしているのは、たったの2行です。
1行目では、Y軸の重なりを見ています。

 

vb y軸の重なりを見ている

 

Sukima.Top+sH よりも Player.Top が小さく、
Sukima.Top よりも Player.Top+pH が大きければ、重なっている(当たっている)
ことになります。
すき間と壁の位置や高さは同じなので、この条件が満たされたときは
プレイヤーと壁が重なる(当たっている)可能性がある訳です。

 

 

Y軸で重なっている可能性があるなら、あとはX軸を調べるだけです。(2行目)
Sukima.Left よりも Player.left が小さいなら左にはみ出していることになり
Sukima.Left+sW よりも Player.Left+pW が大きければ右にはみ出している
ことになります。
はみ出している、すなわち、壁と当たっていることになります。

 

vb 当たり判定の仕組み

 

ちなみに、壁の中に複数のすき間がある場合には、この当たり判定は使えません。
その時には、プレイヤーと壁が重なっているか1つ1つ判断する必要があります。

 

 

ゲームオーバーを表示しよう

当たり判定が入ったのでゲームオーバーを表示しましょう。
ラベルを使って「 GAME OVER 」を作りましょう。
ここは好きなように作ってください。
下の画像ではプロパティを4箇所変更しています。

 

vb ゲームオーバーの表示

 

 

このラベルをプログラムで使用するため名前を変更しましょう。
name プロパティを Gameover にします。

 

vb ラベルの名前変更

 

 

プログラムを変更します。
初期化の中で隠し、当たり判定の中で表示します。

 

vb ゲームオーバーの仕組み

 

 

実行してみましょう。
壁に当たるとゲームオーバーが表示されて、ゲームらしくなってきました。

 

vb ゲームオーバーを入れてみた