ゲームの仕様とCircle, Bullet, Foodクラスの定義 クソゲーに魂を!プロジェクト(1)の続きです。今回はPlayerクラスを定義します。

インデントが深くなるので名前空間部分は省略して表記します。

プロパティとフィールド変数

プロパティとフィールド変数を以下のように定義します。プレイヤーの身体を構成するCircleオブジェクトを格納するための配列デックを使っていますが、これは両端キューを実装するで解説しているものと同じものです。

コンストラクタと初期化

コンストラクタを示します。引数はASP.NET SignalRで使われる一意の接続IDです。これが空文字列の場合、それはNPCです。NPCのときはPlayerIDをつかってNPCの名前をつけます。ユーザーであれば後述するSetPlayerNameメソッドで名前をつけます。

Playerオブジェクトを生成したら初期化の処理をおこないます。具体的には初期位置と初期の進行方向を設定し、各フィールド変数とプロパティに適切な初期値を設定します。

SetCenterメソッドはプレイヤーの座標を中央に設定します。

プレイヤーに名前をつける

プレイヤーに名前をつける処理を示します。引数を16文字以内に短くしてPlayerNameプロパティに格納しますが、GetShortNameメソッドはさらにそれを半角16~17文字以下にします(全角1文字は半角2文字とみなす)。

方向転換と更新処理

方向転換の処理を示します。方向キーが押下状態が変化したときはマウス操作による方向転換を無効にしてIsTurnLeftまたはIsTurnRightを変更します。これによって後述するUpdateメソッドで回頭処理がおこなわれます。またマウス操作がされたときはマウス操作による方向転換を有効にしてAngleByMouseに進行方向をセットします。この場合もUpdateメソッドで回頭処理がおこなわれます。

更新の処理を示します。

IsDead == true であったり Circles.Length == 0 ならなにもしません。そうでない場合はNPCでなければ IsTurnRight == true なら Angle を増加させ、 IsTurnLeft == true なら減少させます。また EnableAngleByMouse == true なら Angle の値を AngleByMouse に近づけます。

NPCのときは NpcTurnRightCount NpcTurnLeftCount が 0 でなければ Angle の値を増減させます。いずれも 0 のときは 1秒毎に左右にクネクネと移動させる処理をおこないます。

そのあとCircles[0]に初期状態から回転した回数、プレイヤーの長さ、スコアなどを記憶させます。

移動の処理を示します。進行方向から新しい頭部の座標を計算してその位置にCiecleオブジェクトを生成します。そして配列デックの先頭に追加します。このとき配列デックの長さがプレイヤーの長さを超えたらプレイヤーの長さと同じになるまで配列デックの最後尾からCiecleオブジェクトを取り除きます。

弾丸の発射

弾丸を発射する処理を示します。

体長が最小値になっているときやTimeForShotが0より大きいときは弾丸は発射できません。またNPCは当たり判定無効時は弾丸を発射しません。

弾丸は自機の前後から自機が向いている方向と逆方向に発射されます。