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

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

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

Visual C# 2017 入門

29.突破4 当たり判定

 

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

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

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

 

 

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

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

 

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

 

 

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

 

ゲームの流れ

 

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

 

 

当たり判定を入れよう

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

 

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

 

 

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

 

壁に当たると止まる

 

 

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

 

hitFlg で動きを止める

 

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

 

 

当たり判定のしくみ

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

 

y軸の重なりを判定する

 

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

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

 

 

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

 

x軸の重なりを判定する

 

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

 

 

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

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

 

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

 

 

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

 

ラベルの名前変更

 

 

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

 

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

 

 

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

 

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