これまではモンスターは同じフロアで左右に移動するだけでした。今回はプレイヤーを追わせます。

プレイヤーを追うアルゴリズム

プレイヤーを追うアルゴリズムですが、この動画をみると最後の敵は左に縦一列に掘った穴に吸い寄せられるように移動しているのがわかります。そして穴にハマって5段落ちでステージクリアとなっています。

ただそれ以外の場合は敵が途中でUターンをしたりよくわからない動きもしています。このあたりのアルゴリズムがさっぱりわからないので、

敵はUターンしなければならない場合を除きUターンはしない
プレイヤーと違うフロアにいる敵はまず同じフロアに移動しようとする

というアルゴリズムで敵を動かします(実際のスペースパニックの敵はこんな動きはしません)。

モンスターが方向転換できる場所とは

モンスターが方向転換するためには敵がプレイヤーがいる位置を知る必要があります。GameManagerクラスからプレイヤーの座標を取得できますね。この座標と敵の座標から敵に適切な方向転換をさせます。

敵が方向転換できるのはハシゴがある部分とフロアの端に来たとき、目の前に他の敵がハマっている穴があるときだけです。

ハシゴの下端の座標はGameManager.LadderPositionsからわかります。ではハシゴの上端の座標はどうなるでしょうか? LadderPositionsのY座標からCharctorSize * 3を引けばいいですね。

まず Enemyクラスのコンストラクタ内で必要な情報は取得してしまいましょう。

モンスターに進行方向を変更させる

次に敵を移動させる処理を考えます。移動方向が決まればその方向に移動させているだけです。水平移動をしているときにハシゴがあったらどうするのか、ハシゴの上り下りが完了したら左右どちらに移動するのかを決めるのが自作メソッドのChangeDirectionです。

ChangeDirectionメソッドを示します。

ハシゴがあったらプレイヤーと同じ階に移動することを追求します。ハシゴの上り下りが完了したらプレイヤーのX座標に合わせて水平移動させます。ハシゴのなかには複数回の移動ができるものがありますが、この場合はプレイヤーがいる階数を目指してそのまま上りまたは下りを継続させます。

プレイヤーとの当たり判定

敵とプレイヤーが接触したらミスとなります。ミス時は各キャラクターの動作を止めます。GameManager.Updateメソッドをしばらく止めればいいですね。

EnemyクラスのIsPlayerDeadメソッドはその敵とプレイヤーが接触しているかどうかを調べています。

当たり判定後の処理

GameManagerクラスのUpdateメソッド内で自作メソッド CheckPlayerDeadを呼び出してプレイヤーが敵と接触しているか調べます。プレイヤーが敵と接触している場合は残機を1減らして3秒後に敵とプレイヤーの位置を初期状態に戻してゲームを再開します。残機0のときはゲームオーバーです。

プレイヤー死亡のときとゲームオーバーのときはForm1クラスで処理ができるようにイベントを発生させます。