ASP.NET Core版 マッピー(MAPPY)をつくる(2)の続きです。今回は敵の動きを実装します。

Enemyクラスの定義

Enemyクラスを定義します。

以降は名前空間を省略して以下のように書きます。

コンストラクタ

コンストラクタを示します。引数はMappyGameオブジェクトと初期座標です。

プロパティ

各プロパティを示します。

落下する処理

敵が穴からトランポリンに向けて落下する処理を示します。

落下した結果、敵のXY座標がともにCHARACTER_SIZEで割り切れるとき、そこにトランポリンがあるか調べます。あるときは移動方向を上方向に変更します。上昇するとき自機と同じ階に移動するのですが、自機もトランポリンで上昇または下降している場合はいつまでたっても上下運動以外できないと困るので、移動方向が上昇に転じたときにどの階でフロアに移動するのかを決めておきます。そしてそれをフィールド変数_rowLandingFloorに格納しておきます。

Game.GetLandingFloorメソッドは現在使用しているトランポリンの座標から移動できる階のリストを取得します。これは以下のように定義されています。

トランポリンのcolから上にあるセルの両脇にあるセルがCell.Aisleであるか、開いているドアである場合はそのときのrowをリストに格納して返しています。

上昇時の処理

上昇処理をするときの処理を示します。

トランポリンで上昇しているときにフロアに移動できる場合はフロアに移動する処理を示します。

ドアを開ける処理

水平移動している敵がドアに接触している場合、普通のドアであれば開けて通ろうとします。パワードアの場合は引き返します。そのための処理を示します。

DoorOpenメソッドではドアを開けることで影響をうける敵を取得し、敵が飛ばされる先のX座標を取得、設定します。またこの場合、PlayerのEnemyDownメソッドを呼び出します。するとPlayer側でイベントが発生します。EnemyクラスではなくPlayer側にイベント発生の処理をさせるのはイベント処理をするにはイベントハンドラを追加しないといけないので、その処理はPlayer側にまとめたい、ただそれだけの理由です。

ドアの開閉に巻き込まれて気絶したあとの処理を示します。CantMoveCountが0より大きいときは敵は動きませんが、飛ばされて倒れる感を出すために少し上方向に移動させたあとLandingPositionXに向けて移動させます。LandingPositionXの近くにきたらそのまましばらくのあいだ倒れたままにします。

敵を死亡させる処理

パワードアから放たれた弾丸にあたったとき敵を死亡させる処理を示します。_timeToReviveは復活するまでに必要な更新回数です。まとめて敵を倒したとき復活する時間をずらしたいのでTIME_TO_ENEMY_REVIVE_MAXに(引数 * 16)を加えています。更新処理がおこなわれたときに_timeToReviveが0より大きい場合はなにもしません。

更新処理がおこなわれたときに_timeToReviveが0より大きい場合の処理を示します。_timeToReviveをデクリメントして0になったら復活の処理をおこないます。Game.EnemyRevivePositionの場所に敵を移動させて下方向に移動させます。

リセット

自機死亡時は敵を初期位置に戻します。そのための処理を示します。

更新処理

更新時の処理を示します。IsDeadのときはReviveメソッドを呼び出して復活にむけての処理をおこない、それ以外のときは移動処理をおこないます。

移動処理は以下のようになっています。