ASP.NET Core版 マッピー(MAPPY)をつくる(1)の続きです。

Playerクラスの定義

Playerクラスを定義します。

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

それから移動方向はDirect列挙体を使って表現します。

コンストラクタ

ここではスコア、移動している方向、最後に左右に移動した方向(キャラクタを右向き左向きのどちらで描画するかを決めるために必要)、プレイヤー名などを初期化します。

Bulletクラスはパワードアを開けたときに発射される弾丸(本物のマッピーでは「衝撃破」)の座標と状態を格納するためのものです。KillCountプロパティはその弾丸に当たった敵の数が格納されます。

プロパティ

ゲーム開始の処理

AspNetCore.SignalRで接続するとMappyGameオブジェクトが生成され、そのなかにPlayerオブジェクトが生成されます。このときクライアントサイドからPlayerを操作できるようにPlayer.ConnectionIdプロパティにAspNetCore.SignalRで接続したときに与えられるIDを設定します。SetConnectionIdメソッドはその処理をおこないます。

ゲームが開始されるとMappyGame.GameStartメソッドが実行され、MappyGame.InitメソッドのなかでPlayerの初期座標がセットされます。そしてPlayerクラスのGameStartメソッドが実行されます。

PlayerクラスのSetInitPositionメソッドは以下のようになっています。自機が死亡したら初期位置に戻ってプレイを続行できるようにフィールド変数に値を格納しています。

PlayerクラスのGameStartメソッドではIsGameOverフラグのクリア、残機を最大値にセット、スコアのリセットなどの処理をおこなっています。またトランポリンの状態を初期化しています。

トランポリンの状態を初期化する処理は以下のようになっています。

移動の処理

更新処理がおこなわれたらキーの押下状態によってプレイヤーを移動させ、弾丸が発射されているのであれば弾丸も移動させます。

プレイヤーを移動させる処理を示します。プレイヤーが上昇または下降している場合は後述するFallメソッドまたはJumpメソッドを呼び出し垂直方向の移動処理をおこないます。そうでない場合は水平方向の処理をおこないます。

移動したあとの座標のXY座標がともにCHARACTER_SIZEで割り切れる場合、そこには穴やドアがあるかもしれません。穴がある場合は落下させ、閉まっているドアがある場合は開けます。

落下の処理

プレイヤーが落下しているときの処理を示します。

プレイヤーのY座標を増加させます。落下先にトランポリンがある場合は移動方向を反転させます。またクライアントサイドでトランポリンの効果音を鳴らす処理ができるようにイベントを発生させます。トランポリンを連続使用できるのは4回までです。そこでTrampoline.Lifeをデクリメントします。0よりも小さい場合はミスの処理をおこないます。

上昇中の処理

プレイヤーが上昇しているときの処理を示します。

Y座標を減らす処理をした後、Y座標がCHARACTER_SIZEで割り切れる場合はそこが天井かどうかを調べます。天井の場合は移動方向を下向きに変更します。またユーザーが左右いずれかのキーを押している場合はそこで床に着地することができる場合はその階に着地させます。この処理ができるかどうかは後述するPlayerLandingFloorメソッドでおこないます。

左右の移動

左右の移動をする処理を示します。PlayerMoveHorizontalメソッドでは左右のいずれかのキーが押されている場合はLastDirectプロパティとLastDirectプロパティにその方向にセットします。このあとMoveDirectプロパティの値によって左右の移動の処理がおこなわれます。どちらのキーも押されていない場合はプレイヤーは移動しません。

接触したドアを開ける

プレイヤーが閉まっているドアに接触したとき、これを開ける処理を示します。プレイヤーの現在位置にドアがあるか調べて、ある場合はそのドアを開けます。

プレイヤーが接触したドアを開ける処理を示します。

ドアを開けたときに敵がドアに巻き込まれる場合、敵を気絶させる処理をおこないます。この処理はThrowEnemiesメソッドでおこないます。敵を気絶させることができた場合は効果音を鳴らすためにEnemyDownEventを発生させます。また該当する敵がいなかった場合は通常のドアの開閉時の効果音を鳴らすためにOpenCloseDoorEventを発生させます。

開けたドアがパワードアの場合はOpenPowerDoorメソッドが呼び出されます。この場合はドアが開く方向に弾丸が発射されます。そのあとパワードアは普通のドアに変わります。またクライアントサイドで発射音を鳴らすことができるようにFireBulletイベントを発生させます。

敵を気絶させる

ドアの開閉時に巻き込まれた敵を気絶させる処理を示します。ドアの近くに敵がいた場合はドアの移動方向に敵を飛ばして気絶させます。

スコアの加算

スコアを加算する処理を示します。

スコアの加算がおこなわれたときはその点数を表示させます。そのため点数と座標をクライアントサイドに伝えることができるようにイベントを発生させます。第二引数が加算される点数、第三引数と第四引数が加算される点数が表示される座標です。

パワードアを開けて敵を倒したときは横に流れるように加算される点数が表示されます。その処理をおこなうメソッドを示します。第二引数が加算される点数、第三引数が点数が表示されるY座標です。

遠隔操作によるドアの開閉

ドアは遠隔操作で開閉することができます。以下はプレイヤーにとって一番近いドアを開閉する処理をおこないます。

トランポリンから着地

トランポリンから着地する処理を示します。

キーが押されているときで移動することができる場所であればMoveDirectにDirect.LeftまたはDirect.Rightをセットします。

アイテムを回収したとき

アイテムを回収したときの処理を示します。アイテムのNumberプロパティによって加算される点数を変えます。またイベントを発生させます。

敵を倒したとき

敵を気絶させたり弾丸で吹き飛ばしたときの処理を示します。

ステージクリア

ステージクリアのときの処理と新しいステージが開始されたときの処理を示します。いずれの場合もイベントを発生させます。

プレイヤー死亡時

プレイヤー死亡時の処理を示します。残機を1減らしてイベントを発生させます。

死亡したプレイヤーを復活させる処理を示します。プレイヤーの座標に記憶しておいた初期座標をセットし、IsDeadフラグをクリアします。

ゲームオーバー時

ゲームオーバー時の処理を示します。IsGameOverフラグをセットしてイベントを発生させます。