Unityを使わずにフリスビーを犬に届けよ!を作ってみるの続きです。今回はPlayerクラスを定義します。

フリスビーを犬に届けよ!の元ネタ

Unishar-ユニシャー【Unityでのゲーム開発を手助けするメディア】

さぎのみや氏のTwitter

さぎのみや氏の個人ブログ

Playerクラスを定義する

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

各種プロパティ

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

ConnectionIdプロパティはAspNetCore.SignalRでサーバーサイドに接続したときに付与されるIDを取得したり設定します。

X、Y、VX、VY、AngleプロパティはフリスビーのXY座標、XY方向の速度、左右の傾きの角度を設定したり取得するためのものです。

Nameプロパティはプレイヤーの名前を設定したり取得するためのものです。

IsDeadプロパティとIsGameOverプロパティはプレイヤーが死亡状態であるかどうか?ゲームオーバー状態であるかどうかを設定したり取得するためのものです。プレイヤー死亡時でなくてもステージクリア時から次のステージが開始されるまでのあいだなどフリスビーを非表示にさせたい場合もIsDeadプロパティがtrueになる場合があります。

IsXXXKeyDownプロパティはプレイヤーによって方向キーがおされているかどうかを設定したり取得するためのものです。

コンストラクタと初期化

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

FrisbeeGameクラスのメソッドを呼び出せるように_gameにFrisbeeGameクラスへの参照を格納しています。またスタートしてからゴールするまでの時間を計測したいのでフィールド変数StartTimeも定義しています。スタートボタンを押すまではゲームが開始されないので初期の状態ではIsGameOverプロパティとIsDeadプロパティはtrueにしています。

SetConnectionIdメソッドはAspNetCore.SignalRでサーバーサイドに接続したときに付与されるIDをConnectionIdプロパティにセットします。

ゲーム開始時の処理を示します。先述のStartTimeに現在時刻を格納します。

フリスビーをスタート地点に配置するための処理を示します。ミス時にフリスビーをスタート地点に戻せるようにフィールド変数にも引数を格納します。

当たり判定

フリスビーの角にあたる部分の座標を取得します。フリスビーはゲーム中に傾くことがありますが、4つの角の座標のうち、ひとつでも障害物の内部に入ってしまったら障害物にぶつかったことになり、ミスと判断されます。

IsMissメソッドは上記のGetFrisbeeCornersメソッドで4点の座標を取得し、障害物のどれかの内部に存在するかを調べます。

IsStartメソッドはフリスビーの4点がスタート地点にある台の内部にあるかどうかを調べます。フリスビーは重力の影響をうけて下に落下していきますが、スタート地点にあるときはそれ以上下に落下しない(スタート地点の台にめり込まない)ようにしています。

IsGoalメソッドはゴール判定のメソッドですが、フリスビーの4点すべてがゴール領域に入らないとtrueを返さないようにしています。

プレイ時間の計測

GetElapsedTimeメソッドはゲームが開始されてからの経過時間を返します。

更新処理

更新時の処理を示します。

まずプレイヤー死亡時はなにもしません。もし現在位置がスタート地点の内部であればフリスビーをスタート地点の上側に戻します。ゴールしているのであれば星の描画処理をおこない、StageClearedイベントを発生させます。それからステージクリアしたあとはフリスビーを非表示にさせるために死亡フラグをセットします。

それ以外の時でキーが押されているときはフリスビーの方向を変更したり加速処理をおこないます。そのあと現在のXY方向の速度に応じてフリスビーの座標を変更します。そのあと障害物に当たっていないか調べます。ミス時は一定時間が経過するのを待ってからスタート地点に戻してゲームを続行します。