今回はASP.NET Coreで3Dっぽいカーレースをつくることに挑戦します。

はじめに

このことはプログラミング実況配信系YouTuberであるT.Umezawaさんに「次回は3Dのカーレースをつくる」と宣言し、作業の進捗状況も報告していました。そして完成。

昨日は配信が開始されるまえにサーバーにアップして新着記事からリンクをはり、後は配信がはじまるのを待つのみ。配信がはじまったら「できたよ!紹介してください!」という予定だったのですが、配信がはじまったのでアクセスするとすでにゲームがはじまっていました。

配信中にT.Umezawaさんだけでなく彼の視聴者さんもプレイしてくれたので、30位まで表示されるスコアランキングはすべて埋まりました。みなさん、ありがとうございました。

ゲームの内容ですが、TypeScript/JavaScriptでつくる3Dカーレースゲームと同じです。違いは新しく作ろうとしているものがASP.NET Coreでつくること、ひとりだけでなく複数で対戦することができるということです。

では作成していきましょう。

コースデータの作成

最初にコースのデータを作成します。

筑波サーキット | わかりやすい モータースポーツ競技規則にコースの画像があったので、これを加工してつくった以下の画像をつかいます。

この各ピクセルの色を調べてBlackであれば1、そうでなければ0として文字列に置き換えます。こうしてできたのが以下のテキストファイルです。

テキストファイル コースデータ

サーバーサイドでおこなうプレイヤーの車がコースアウトしているかの判定はこれを用いておこないます。

Gameクラスの定義

Gameクラスの定義をおこないます。

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

と書きます。

初期化

Gameクラスのコンストラクタを示します。Gameクラスのインスタンスは別のクラスにstaticで生成するので、このコンストラクタはアプリが起動したら終了するまで1回しか実行されません。

ここでやることは前述のテキストファイルを読み込み、必要な処理をすぐに返せるように準備をすることです。

前述のテキストファイルを読み込み、二次元配列 Map に0か1を格納しています。

GetBorderPointsメソッドはコースの境界線を構成する座標を取得します。この処理は何度もおこなうと時間がかかるので最初の1回だけおこない、結果を配列 Borders1とBorders2 に保存しておきます。

それからPointクラスは以下のようになっています。System.Drawing名前空間のPointクラスではありません。

辞書で必要なデータをすばやく取得

ゲームの進行上、プレイヤーの各座標において一番近い境界線の座標とその座標において一番近いコースの中央になる座標、最適の方向を取得する処理が短時間で何度も必要になります。そのときにその都度取得していては処理が間に合わないので最初にまとめて取得して辞書に格納しています。これで処理速度の大幅な向上が実現できます。

これを最初はやらなかったため、プレイヤーとは別のライバル車(NPC:non player character)の数を増やすと処理が間に合わずカクツキどころか止まってばかりでゲームにならなかったのですが、これによってNPCを6台まで増やすことができました。

あとは値を取得する必要があれば辞書を検索して値を返せるようにするだけです。

タイマーのイベントが発生したらプレイヤーとNPCに対する移動の処理をおこないます。

次回はプレイヤー(NPC含む)の動作に関するサーバサイドの処理を解説します。