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

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

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

Visual Basic 2019 入門

29.突破4 当たり判定

 

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

ゲームの開発をしていて一番わくわくするのが当たり判定です。
なぜかと言うと、絵を表示して動かすだけのプログラムに
当たり判定を入れると、世界を構築している感じが出てくるからです。

例えばレースゲームを思い浮かべてください。
当たり判定がなければ、他の車や壁に当たってもすり抜けてしまいます。

 

 

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

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

 

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

 

 

ここで処理の流れを図にしてみると次のようになります。
プログラムを図にしたものではなく、関係性をイメージしました。

ゲームの流れのイメージ

 

ゲームの初期化は、起動後とゲームオーバー後のリトライで行うことになります。
それに対しプレイヤーの初期化は、発射後に毎回おこなわれます。

どんなゲームでも初期化は必要になるので、
あらかじめ作ってしまうのがいいでしょう。

 

 

当たり判定を入れよう

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

 

当たり判定を入れる

 

 

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

当たり判定のテストを行う

 

 

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

当たり判定のテストを行う

 

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

 

 

当たり判定のしくみ

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

 

y軸の重なりを見る

Sukima.Bottom よりも Player.Top が小さく、
Sukima.Top よりも Player.Bottom が大きければ、重なっている(当たっている)ことになります。

すき間と壁の位置や高さは同じなので、この条件が満たされたときは
プレイヤーと壁が重なる(当たっている)可能性がある訳です。

 

 

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

すき間の左側との当たり すき間の右側との当たり

 

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

 

 

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

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

 

ゲームオーバーの表示

 

 

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

ラベルの名前を変更する

 

 

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

ゲームオーバーの表示をon.offする

 

 

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

ゲームオーバーの表示テストをする