前回 ASP.NET Coreで3Dっぽいカーレースをつくる(1)の続きです。今回はPlayerクラスの定義をおこないます。

Playerクラスの定義

インデントが深くなるので以降、この記事のなかでは

と書きます。

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

Playerクラスのフィールド変数を示します。

次にプロパティを示します。

次にイベント関連を示します。

初期化

コンストラクタを示します。これはプレイヤー用のものとNPC用の2種類があります。

プレイヤー用のコンストラクタではConnectionIDプロパティに接続されたときのconnectionIDを設定します(NPC:non player character の場合は空文字)。そのあと残機を最大値にしてStartTimeとLastTimeにそのときの時刻をセットします。そして車の座標にスタート地点の座標を設定します。

NPCの場合はスタート地点ではなくコース上の分散された位置からのスタートになります。そこでそのときの座標と移動速度を各プロパティに設定します。

車の移動処理

車(ただしNPCは除く)を移動させる処理を示します。

ここではユーザーが押しているキーによって方向転換、加速、減速処理をおこなうのですが、方向転換の際にコースを逆走できないようにGame.GetIdealRotationYメソッドで最適化された移動方向を取得し、これと左右90度以上はずれている場合は方向転換できないようにしています。

クラッシュ時の移動処理

クラッシュ時の処理を示します。

NPC同士が衝突することもあります。このときNPCがクラッシュから復帰するタイミングが同じだとまたクラッシュしていつまでもレースに復帰することができなくなります。そこでNPCの場合はクラッシュから復帰するまでの時間を乱数で分散させています。

プレイヤーがクラッシュして吹っ飛んでいるときの処理を示します。プレイヤーがクラッシュして吹っ飛んでいるように描画されるのはプレイヤー自身だけです。それ以外の場合はその場でスピンします。そこでここではBlowingCountをカウントアップさせているだけです。BLOWING_COUNT_MAXに達したらクラッシュから復帰します。

クラッシュから復帰したら車をコースの真ん中に移動させ、コースを走るうえで最適化された方向に向かせます。そして残機が0になっていない場合はRecoverイベント、残機が0になっている場合はGameOveredイベントを発生させます。

canvasの上部に表示させる文字列の生成

ゴールしたかどうかを調べるための処理を示します。かなりいい加減な方法ですが、出発点の座標の近くにいればゴールとみなします。

ゲーム中にcanvasの上部に表示させる走行時間、走行時間、残機数などの文字列を表示させますが、これを生成するための処理を示します。

時速と移動距離の計算ですが、モデルにした筑波サーキットの1周の長さとゲームで実際に表示される値がだいたい同じになるように定数をかけて調整しているだけです。0.656と216はマジックナンバーです。

更新処理

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

_invincibleが0以上のときは無敵状態なので当たり判定は後述する当たり判定の対象からはずします。ConnectionIDが空文字のときはNPCなのでこの場合は後述するNpcUpdateメソッドで処理をおこないます。プレイヤーの場合は前述のメソッドで移動処理をおこないます。

NPCの更新処理をしめします。

BlowingCountが0より大きいときはBLOWING_COUNT_MAXに達するまでカウントアップします。その結果、BLOWING_COUNT_MAXに達したらレースに復帰させます。

走行中はコースアウトしているのであればコースの中央に移動させ、片方に寄りすぎていない調べて移動方向を調整します。NPCは加速も減速もせず、コンストラクタにわたされた値をつかって一定速度で走行します。

プレイヤーがゲームオーバーになった場合、そのPlayerオブジェクトはNPCとなります。そのためにはConnectionIDを空文字にします。また速度が0になっているので適当な値を設定します。またNameプロパティにNPCのもとの名前を設定します。