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

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

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

VisualBasic 2017 入門

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 ゲームオーバーを入れてみた