ASP.NET Core版 ボンバーマンのような対戦型ゲームをつくる(4)の続きですが、ここからは延長戦です。

実は一度プログラミング実況配信系YouTuberのT.Umezawaさんの配信で紹介していただいたのですが、そこで問題点がいくつか発生。一応、それらは改善してもう一度レビューしていただくことにしました。これがその配信動画です。

35:00あたりから辛口レビューが始まります。

浮上した課題

新たにプレイヤーが参戦したときにキャラクタがワープしてしまう問題について

これに対しては新たにプレイヤーが参戦したことを通知するメッセージを表示する。プレイヤーを点滅させることで違和感を減らせるのではないかと考えていたのですが、やっぱり見る人によっては違和感はなくならないようです。しかもそのさいに設置されている爆弾が消えてしまうのも違和感があるとのこと。

ではどうすればいいのか? 爆弾を消さない代わりに無敵状態を長くする? それだと長時間プレイヤーが点滅するのでこれも変に見えてしまうかもしれません。

そこで対案として出てきたのが

最初は壁のなかなど攻撃されない場所に登場させる

またこれだけだとそのままの状態で放置されると他の人がいつまで経ってもプレイに参加できないという問題がおきるのですが、それについては

一定時間経過したら強制的に通路に出される

ようにすることでよいのではないかと助言をいただくことができました。これで違和感があるかどうかは実際につくって動かしてみないとわかりません。

また斜め移動のバグへの対策ですが、

動作が鈍くなったのではないか

という指摘も受けました。これは移動可能フラグをその都度リセットしているからなのですが、やり方がよくなかったようです。

ほかにも

同時にプレイできるのが4人までは少なすぎる

とか

壁がなくなってしまってもそのままなのは改善すべき

というありがたい意見をいただくことができました。

これは突然壁が出現すると違和感必至なので、壁が出現する前に出現する壁を点滅させるとかの演出をいれればそれほど違和感はないかもしれません。そのあたり改良してみようかと考えています。

今日はここまで。修正のコードが書けたら掲載します。過去記事は修正しないでここに加筆していこうと思います。

同時にプレイできる人数を増やす

簡単にできそうなものからやっていくことにします。

同時にプレイできる人数を増やす場合、最初に登場する位置も変えたほうがいいかもしれません。正方形のフィールドの各頂点だけでなく各辺の中点にも登場させるようにすれば8人でプレイできるゲームに作りかえることができます。

Playerクラスの修正

まずPlayerクラスに変更を加えます。

ここではResetメソッドの引数が0~3から0~7に増えるのでその場合の初期座標を設定しています。それからプレイヤーの登場場所はフィールドの外の壁のなかとします。それからいつまでもフィールドの外にいると他の人がプレイに参加できなくなるので5秒経過しても壁のなかにいる場合は強制的にフィールドのなかに移動させます。

強制的にプレイヤーをフィールド内に移動させるメソッドを示します。

UpdatePlayerメソッドが呼び出されたらTimeToStartをデクリメントします。強制的に移動させる処理をおこなうのはTimeToStartが0になったときで、それまで移動処理が行なわれていない場合です。この場合はForceMoveメソッドを呼び出して移動処理をおこないます。

それからこれまでは外に破壊できない壁が存在したため場外に移動することはできなかったのですが、初期位置が変更されたことで場外への移動が可能になってしまいました。しかも一度場外で出てしまうと戻ってくることができません。これでは困るので上下左右に移動できるかを調べるメソッドを修正します。

Gameクラスの修正

プレイヤーの数が増えてフィールドの辺の部分にプレイヤーが配置されるようになったので、初期の破壊できる壁の位置を変更します。

BomberHubクラスの修正

プレイヤーの総数が変更されたのでASP.NET Core SignalRで接続されたときの処理を変更します。

ゲームスタートのとき自分が一人目のプレイヤーの場合は壁をリセットします。この場合、変更された壁の座標をすべてのユーザーに送信します。

クライアントサイドの処理の修正

クライアントサイドの処理で変更になる部分を示します。

プレイヤー増にともなって表示するキャラクタと項目が増えました。

Pages\Bomber\game.cshtml

wwwroot\bomber\app.js