ASP.NET Core版 対戦型ラリーエックスをつくる(1)の続きです。

Playerクラスの定義

Playerクラスを定義します。それから方向にかんする列挙体を定義します。

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

主要なプロパティを示します。

初期化

コンストラクタを示します。

Resetメソッドはプレイヤーの初期位置を設定します。このメソッドが実行されると、RallyXGameクラスのXXXPositionsプロパティからプレイヤーの初期位置を取得し、これをXプロパティとYプロパティにセットします。また初期の移動方向の設定もおこないます。

それと同時に死亡フラグのクリアして燃料を満タンにします。FlagCountプロパティとKillCountプロパティをリセットして、しばらくのあいだ無敵状態にします。

移動に関する処理

CanMoveXXXメソッドはその方向に移動できるかどうかを調べて結果を返します。

ラリーエックスの場合は途中で立ち止まることができません。壁に当たったら移動可能な方向に方向転換して移動し続けます。キー操作がされていないのであればそのまま直進し、それができない場合は移動できる方向をランダムに取得して返す処理を示します。基本的にUターンはしません。

煙幕のなかに入ってしまったときの処理

IsSmokeメソッドは煙幕のなかにいるかどうかを調べて結果を返します。煙幕のなかにいても自身に効果がない煙幕であればfalseを返します。

RallyXGame.GetSmokesメソッドは以下のように定義されています。

煙幕のなかに入ってしまうと車はしばらくのあいだスピンしてその後移動方向を反転させます。GetDirectInSmokeメソッドは煙幕に突っ込んだ場合、移動可能であればこれまでの移動方向とは逆の方向を返します。移動できない場合は移動できる方向を取得してそれを返します。

更新時の処理

プレイヤーの更新時の処理を示します。

死亡時にはなにもしません。それ以外のときは燃料を減らして無敵状態であるならInvincibleTimeを減らします。スピンしているのであればTimeToSpinを減らします。

X座標とY座標が両方ともCHARACTER_SIZEで割り切れる場合は、煙幕のなかに突入していないか調べたあと、方向転換の処理をおこないます。方向キーがおされていてその方向に方向転換できるときだけ方向転換の処理をおこないます。ただしスピンしている状態の場合はなにもしません。

方向キーがおされていない場合や押されているけど移動可能な方向でない場合は、前回と同じ方向に移動させることができるならそのまま維持し、壁にぶつかった場合は移動可能な方向に転換します。

X座標とY座標の両方がCHARACTER_SIZEで割り切れる場合でないときは方向転換はできません。その方向に4ピクセル移動します。移動した結果、X座標とY座標が両方ともCHARACTER_SIZEで割り切れる場合はCurrentColumnとCurrentRowを更新します。

死亡時の処理

死亡時の処理を示します。

死亡時はいったんIsDeadフラグをtrueにします。そして残機を1減らし、2秒後に復活させます。ただし残機1減の結果、0になってしまった場合はゲームオーバーです。ゲームオーバーの場合はイベントを発生させます。ただしNPC(non player character)の場合はゲームオーバーはありません。

復活させるときはResetメソッドを実行させます。リセットすべきプロパティがリセットされてゲームが続行されます。

NPCの動作

NPCの動作にかんする処理を示します。

NPCが次に移動する方向を取得するための処理を示します。

NPCの更新処理を示します。プレイヤーのときと同様、X座標とY座標がCHARACTER_SIZEで割り切れるときだけ方向転換の処理をして、それ以外のときは移動方向に4ピクセル移動するだけです。

X座標とY座標がCHARACTER_SIZEで割り切れるときは現在スピン状態ではなく、煙幕に突入していない状態であることを確認して上記のメソッドで取得した方向をMovingDirectにセットします。

それから背後から敵が迫っているかもしれません。そこでNPCの後ろ側の近い位置に敵がいる場合は煙幕を放出させます。

煙幕を放出する処理を示します。RallyXGameクラス内で以下のように定義しています。