動作確認はこちらからどうぞ。

これまで作成したゲームはデータが表のような形でしか描かれていません。これでは面白くないので地図を表示します。それから城のある位置に家紋を表示させます。これでどこがその城をおさえているのかがわかりやすくなります。

地図はこれを使います。

家紋はこれを使います。

Blazor WebAssemblyで描画処理をするのでBlazor.Extensions.Canvasを使います。NuGetでインストールしておきます。

index.htmlに1行追加します。

それからIndex.razorは以下のようにします。

Index.csの追加部分ですが、

フィールド変数部分

OnAfterRenderAsyncメソッドをオーバーライドしてこの中でタイマーを仕掛けて自作メソッド Updateを呼びます。

Updateメソッドの内容ですが、地図の城があるあたりの座標に城の名前と城主の家紋を描画し、地図の横に城の状態をしめす文字列を描画しているだけです。

地図の城があるあたりの座標に城の名前と城主の家紋を描画するDrawCastleImageメソッドを示します。城のイメージは城主が誰かしらべてその家紋を描画しています。GetImageFromCastleNameメソッドは城の名前から家紋のイメージを取得する自作メソッドです(後述)。

地図の横に城の状態をしめす文字列を描画するDrawCastleStatusメソッドを示します。

城の名前から家紋のイメージを取得するGetImageFromCastleNameメソッドを示します。

ゲームが開始されるまえはCurentCastleStatusList == nullなので元の城主の家紋を返します。ゲームが進行しているときはCurentCastleStatusList.First(x => x.CastleName == name)とすることでその城のCastleStatusオブジェクトを取得してCastleOwnerプロパティから城主を調べ、これに対応するElementReferenceを返します。

これだと最初に読み込まれたときになにも表示されないので(ページが読み込まれた直後ではフィールド変数 ElementReference imageMapなどに適切なデータが入っていないからか?)、しばらく待ってからもう一度Updateメソッドを呼び出しています。このあたりインチキ臭い方法ではなくちゃんと方法があるはずなのですが・・・。