ASP.NET Core版 対人対戦できるぷよぷよをつくる(2)の続きです。

cshtmlファイル

cshtmlファイルをPagesフォルダの配下に作成し、以下のように記述します。

Pages\PuyoMatch\game.cshtml

それから表示させたい画像ファイルや再生したい音声ファイルをwwwrootフォルダ配下(ここではwwwroot\puyo-match\soundとwwwroot\puyo-match\sound-count)に配置します。

JavaScript部分

主なグローバル変数を示します。

wwwroot\puyo-match\puyo-match.js

ページが読み込まれたときの処理

ページが読み込まれたときの処理を示します。

HTMLに通信が切断されてしまったときのエラーメッセージが書かれていますが、最初は非表示にします。canvasのサイズを設定して黒で塗りつぶします。また効果音のボリューム設定や両プレイヤーのPing値を表示するためにPing送信するための初期化の処理をおこないます。

wwwroot\puyo-match\puyo-match.js

接続成功時の処理

AspNetCore.SignalRで接続に成功したらその旨をページ下部に表示します。また接続したときのIDとフィールドの最大行数と最大列数も送られてくるのでそれもグローバル変数に保存します。

wwwroot\puyo-match\puyo-match.js

通信が切れてしまったときはエラーメッセージを表示させます。またゲーム続行不能になっているのにBGMが流れ続けるのはおかしいのでBGMも止めます。

エントリー開始からゲーム終了になるまでのあいだ通知が送られてくるのでそれをページ上部に表示させます。

サーバー側から生存確認用のデータが送られてくるので受け取ります。ここではとくに処理はおこないません。

エントリーしている人数(実質的には0または1)や現在対戦中のゲームの数が変更されたら、それを表示します。

登録完了時の処理

現在の仕様ではゲームに参加したいプレイヤーは事前にエントリーボタンをクリックしてエントリーする必要があります。ボタンをクリックされたときにおこなわれる処理を示します。

サーバーサイドでエントリーの処理が正常におこなわれたら、クライアントサイドには”EnteredToClient”が送信されます。これを受信したときの処理を示します。

ここではエントリーボタンを非表示にしてゲームの方法を記述した部分を非表示にしています。

マッチングが成功したら成功したらその旨を表示するとともに効果音を鳴らします。

ゲーム開始時の処理

ゲーム開始処理が正常におこなわれたときはサーバーサイドから”EventGameStartToClient”が送信されます。

マッチングが成功するとPuyoMatchGameクラスにプレイヤー情報が登録されますが、ゲーム開始時に0番で登録された場合は引数としてtrueが送られてきます。これによってどちらであっても自分自身が常に左側に表示されるようにします。

キー操作時の処理

キー操作がおこなわれたときはサーバーサイドに押下されたキーを送信するのですが、キーが押下されているあいだサーバーサイドに連続して送信がおこなわれないようにフラグで制御しています。

更新と描画

描画処理に必要なデータを受信したときの処理を示します。

描画処理に必要なデータを受信したときはグローバル変数にデータを保存します。そして”EndUpdatedToClient”を受信したら保存されたデータを使って描画処理をおこないます。

まずはグローバル変数を示します。

落下中のぷよの情報はサーバーサイドから”FallingPuyoUpdatedToClient”で送られてきます。受信したらグローバル変数に格納します。このとき引数isFirstPlayerとグローバル変数isThisFirstPlayerの状態をみてどちらを~0側に格納するかを切り分けています。

それ以外のデータが送られてきたときも同様に処理します。

相殺が発生したときは効果音を鳴らしたあと、1秒間だけ相殺されたおじゃまぷよの数を表示させます。

回転したときや組ぷよが着地したときも効果音を鳴らしますが、鳴らすのは自分のぷよのみが対象です。

連鎖発生時は連鎖数に応じて効果音を変えます。

おじゃまぷよが落ちてくるときも効果音を鳴らします。

サーバーサイドから”EndUpdatedToClient”が送られてきたらUpdate関数(後述)を呼び出して描画処理をおこないます。

ぷよの描画をするときにどのイメージを使用するのかを取得する関数を示します。

あとは保存されているグローバル変数を用いて描画処理をおこなうだけです。

最後に上記の関数を呼び出して描画処理をおこないます。