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

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

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

Visual C# 2019 入門

29.突破4 当たり判定

 

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

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

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

 

 

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

これからの作業のためにゲームの初期化メソッド initGame を用意します。
プログラムを次のように変更してください。
Form1_Load ではゲームの初期化をおこない、プレイヤーの初期化 initPlayer はゲームの初期化の中に入れます。

 

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

 

 

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

 

ゲームの流れイメージ

 

ゲームの初期化は、起動後とゲームオーバー後のリトライで行うことになります。
それに対しプレイヤーの初期化は、発射後に毎回おこなわれるので
2つに分けることにしました。
どんなゲームでも初期化は必要になるので、
あらかじめ作ってしまうのがいいでしょう。

 

 

当たり判定を入れよう

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

 

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

 

 

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

 

壁に当たると止まる

 

 

動きを止めているのは movePlayer と moveSukima の中に入れた hitFlg 判定です。
当たったとき hitFlg を true にしているので条件文に引っ掛かり
メソッドを抜けるようになります。

 

hitFlg で動きを止める

 

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

 

 

当たり判定のしくみ

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

 

y軸の重なりを判定する

 

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

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

 

 

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

 

x軸の重なりを判定する x軸の重なりを判定する

 

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

 

 

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

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

 

ラベルでゲームオーバーの表示

 

 

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

 

ラベルの名前変更

 

 

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

 

ゲームオーバーの表示を行う

 

 

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

 

ゲームオーバーを入れてテストを行う