今回は当たり判定の処理を実装します。

当たり判定の処理

敵とプレイヤーが重なっているかどうかはプレイヤーと敵の座標を比較すればわかりそうですが、立体交差になっている部分があるので、そのときは除外しなければなりません。両者が同じ橋のうえにいる、または両者とも橋ではない場所にいるのであれば接触していると判断できます。

XY座標それぞれの違いの絶対値の和が CharactorSize / ExpansionRate よりも小さければ接触していることになりますが、もうすこし接近した場所にしたほうが自然にみえるかもしれません。そこでXY座標それぞれの違いの絶対値の和が CharactorSize / ExpansionRateの半分よりも小さいときに接触していると判定しています。

敵を倒したときの処理

敵を倒したときの処理です。いったんタイマーを停止させ、敵は最初に出現する位置に戻します。そして加算される点数を表示させます。そしてタイマーを再スタートさせてInvalidateメソッドを呼び出します。

加算される点数は最初は100点、その後、倍々と増えていき、最大で9900点まで増えます。ミスをしたりステージクリアのときはリセットされて100点に戻ります。

ミスをしたときの処理です。この場合もいったんタイマーを停止させます。そしてプレイヤーと敵をゲーム開始の位置に戻します。そしてタイマーを再スタートさせてInvalidateメソッドを呼び出します。

ミスをしたときの処理

敵を倒したときに加算される点数を表示させるための処理を示します。これをForm1.OnPaintメソッドの最後に追加しておきます。

効果音を鳴らす

プレイヤーがローラーをもって移動しているときに音を鳴らします。

最初だけ普通に音を鳴らし、あとはイベントハンドラ Timer1_Tickが呼び出されるたびに再生が終了していて効果音を鳴らす必要があるときだけ再生処理をおこないます。

Scoreプロパティに値がセットされたらスコアを表示します。フォームの左上あたりにLabelをはりつけて(label1)そこにスコアを表示させます。

最後にイベントハンドラ Timer1_Tickのなかで CheckHitメソッドとSoundRollerIfPlayerHoldメソッドを呼びだすようにすれば当たり判定の処理は完成です。

BGMを鳴らす

効果音を鳴らしたので、ついでにBGMを鳴らす処理も考えます。

まずはこんなクラスを作成します。PlayBGMメソッドが実行されるとBGMの再生が開始されます。またタイマーで300ミリ秒ごとに再生が完了しているかチェックして完了しているときはもう一度最初から再生しなおします。再生を終了するときはStopBGMメソッドを実行します。このときタイマーも停止しないとすぐに再生が再開されてしまいます。

BGMクラスのオブジェクトをフィールド変数として作成し、ゲーム開始のタイミングでPlayBGMメソッド、終了のタイミングでStopBGMメソッドを実行すればよいのではないでしょうか?