ASP.NET Coreで3DのSpaceWar!のような対戦型ゲームをつくる(1)の続きです。Playerクラスを定義します。

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

プロパティ

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

初期化

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

初期状態の速度の設定

現在の機首方位角とピッチ角を設定からXYZ各方向の速度を設定する処理を示します。またNPCの場合は初期の機首方位角とピッチ角を乱数をつかって設定します。

初期座標の設定

以下はPlayerNumberを参照して各プレイヤーの初期の座標を設定するメソッドです。

弾丸の発射

弾丸を発射する処理をするにあたってBulletクラスを定義します。

Bulletクラスの定義

コンストラクタの引数は発射位置のXYZ座標、XYZ方向の速度、発射したプレイヤーです。弾丸はなにかに命中するまでどこまでも飛び続けるのではなく1回の更新処理ごとにLifeがデクリメントされ、0になると消えてしまいます。またフィールドの端に来たら反対側にワープします。

発射処理

弾丸を発射する処理を示します。連続で発射できるのは20発までです。効果音を鳴らすためにイベントを発生させます。

NPCがプレイヤーにむけて弾丸を発射したら機関銃を乱射するような効果音を出すことにします。NPCがプレイヤーにむけて弾丸を発射したらBeingAttackedメソッドが呼び出されてイベントが発生します。

移動と更新処理

更新処理のメインの部分を示します。プレイヤーであればChangeDirectメソッド、NPCであればNPC_ChangeDirectAndShotメソッドを呼び出して進行方向を設定します。そのあとXYZ方向の速度をそれぞれ算出して移動処理をおこなっています。

自機の方向転換

方向キーの状態を調べてプレイヤーの機体の方向を変更する処理を示します。

NPCの方向転換

NPCの方向転換と弾丸を発射する処理を示します。

まず自分の一番近くにいる敵を取得し、機体をその方向に変更します。そして敵がいる方向と機体角度の差が小さい場合は弾丸も発射します。この処理をあまり正確にやられると人間側には勝ち目がないので更新処理ごとに毎回するのではなく間隔を開けています。

バンク角の取得

_updateCountの値からバンク角を取得します。これによって左右に揺れながら飛んでいるように見せます。

機体がフィールドの端に来たら反対側にワープさせます。そのための処理を示します。

カメラ座標の取得

クライアントサイドでプレイヤーを描画するときにカメラ座標が必要です。それを取得する処理を示します。

以下の処理は進行方向に対して後ろ側から追いかけるカメラの座標を取得し、その結果をCameraXプロパティ、CameraYプロパティ、CameraZプロパティにセットします。

被弾時の処理

被弾したらLifeを1減らしLifeが0のときは後述するDeadメソッドを呼び出し、そうでない場合はSetShortInvincibleTimeメソッドを呼び出して1秒間無敵状態にします。

死亡時の処理

死亡時の処理を示します。残機を1減らして3秒後に復活させるのですが、プレイヤーで残機0の場合はゲームオーバーになります。NPCの場合と残機がある場合はResetメソッドを呼び出してゲームを続行します。

死亡処理から復活する処理

死亡処理から復活する処理を示します。初期座標に移動させ、NPCの場合はSetInitVelocityメソッドを呼び出して初期の機体方位角とピッチ角を乱数で設定します。プレイヤーの場合は機体方位角とピッチ角はともに0とします。そしてしばらくのあいだ無敵状態にします。

ゲームオーバー時の処理

ゲームオーバー時の処理を示します。SpaceWarGame.RemovePlayerメソッドを呼び出して辞書に登録されているPlayerを削除します。そしてGameOverEventイベントを発生させます。

敵を倒したときの処理

敵を倒したらEnemyDeadメソッドが呼び出されます。するとEnemyDeadEventイベントが発生します。