Visual C# 2017 入門
29.突破4 当たり判定
今回は [ 突破3 初期化とクリックイベント ] の続きです。
ゲームの開発をしていて一番わくわくするのが当たり判定です。
なぜかと言うと、絵を表示して動かすだけのプログラムに
当たり判定を入れると、世界を構築している感じが出てくるからです。
例えばレースゲームを思い浮かべてください。
当たり判定がなければ、他の車に当たっても、壁に当たってもすり抜けてしまいます。
ゲームの初期化を用意しよう
これからの作業のためにゲームの初期化メソッド initGame を用意します。
プログラムを次のように変更してください。
Form1_Load ではゲームの初期化をおこない、プレイヤーの初期化 initPlayer は
ゲームの初期化の中に入れます。
ここで処理の流れを図にしてみると次のようになります。
プログラムを図にしたものではなく、関係性をイメージしました。
ゲームの初期化は、起動後とゲームオーバー後のリトライで行うことになります。
それに対しプレイヤーの初期化は、発射後に毎回おこなわれるので
2つに分けることにしました。
どんなゲームでも初期化は必要になるので、
あらかじめ作ってしまうのがいいでしょう。
当たり判定を入れよう
プレイヤーとすき間を使って当たり判定を入れます。
くわしい説明はあとでしますから、まずはプログラムを変更してください。
実行してみましょう。
初めは壁に当たらないように、すき間を狙って発射します。
すき間を抜けて画面上まで移動すると思います。
次は壁に当たるように発射してください。
壁とプレイヤーが当たると動きが止まります。確認しましょう。
動きを止めているのは movePlayer と moveSukima の中に入れた hitFlg 判定です。
当たったとき hitFlg を true にしているので条件文に引っ掛かり
メソッドを抜けるようになります。
ゲームの初期化 initGame の中で hitFlg を false にすることを
忘れないようにしましょう。
ゲームの初期化の役割は、すべてをリセットすることですから。
当たり判定のしくみ
当たり判定をしているのは、たったの2行です。
1行目では、Y軸の重なりを見ています。
Sukima.Top+sH よりも Player.Top が小さく、
Sukima.Top よりも Player.Top+pH が大きければ、重なっている(当たっている)ことになります。
すき間と壁の位置や高さは同じなので、この条件が満たされたときは
プレイヤーと壁が重なる(当たっている)可能性がある訳です。
Y軸で重なっている可能性があるなら、あとはX軸を調べるだけです。(2行目)
Sukima.Left よりも Player.left が小さいなら左にはみ出していることになり
Sukima.Left+sW よりも Player.Left+pW が大きければ右にはみ出している
ことになります。
はみ出している、すなわち、壁と当たっていることになります。
ちなみに、壁の中に複数のすき間がある場合には、この当たり判定は使えません。
その時には、プレイヤーと壁が重なっているか1つ1つ判断する必要があります。
ゲームオーバーを表示しよう
当たり判定が入ったのでゲームオーバーを表示しましょう。
ラベルを配置して「 GAME OVER 」を作ります。
ここは好きなように作ってください。
下の例ではプロパティを4箇所変更しています。
このラベルをプログラムで使用するため名前を変更しましょう。
name プロパティを Gameover にします。
プログラムを変更します。
初期化の中でラベルを隠し、当たり判定の中で表示します。
実行してみましょう。
壁に当たるとゲームオーバーが表示されるようになりました。
ゲームらしくなってきましたね。