Blazor WebAssemblyでテトリスを作ってみようと考えました。「Blazor WebAssembly テトリス」で検索してもそれっぽい情報は出てきません。そもそもゲームをつくるのであればもっと適切な方法を使うべきかもしれません。いまからやることは邪道なのかも。できあがったものも動作が遅くちょっと残念な結果になってしまいました。

ゲームをつくるのであれば描画処理とキーがおされたときの処理が必要です。Blazor WebAssemblyで描画処理をするにはどうすればいいのでしょうか? 調べてみたところ、Blazor.Extensions.Canvasがみつかりました。また落下してくるテトリミノを操作するためにはキーが押されたときのイベントを処理しなければなりません。これに対してはToolbelt.Blazor.HotKeysを使います。

まずBlazor.Extensions.Canvasの使い方から。パッケージマネージャーでBlazor.Extensions.Canvasをインストールしましょう。

そしてwwwroot.index.htmlに以下を追加します。追加するのは1行だけです。

そしてこのようにすれば矩形を描画することができます。

タイマーを使えば移動もできそうです。

ところがこれでは他のページに移動するときにエラーが発生します。

さらに以下を追加します。

ではキー操作に関する処理はどうすればいいのでしょうか?

まずはパッケージマネージャーでToolbelt.Blazor.HotKeysをインストールしましょう。

そしてProgram.csに以下の2行をを追加します。ほかはそのままで問題ありません。

OnInitialized()メソッドのなかでHotKeysContext の作成と、キーの打鍵で呼び出すコールバックの登録をおこないます。左右のカーソルキーをおすと表示されている数字が増減します。おわったらDispose()メソッドでHotKeysContext オブジェクトも破棄しましょう。

次に音を鳴らす方法を考えます。

うまい方法があるのかもしれませんが、あまり情報がありません。調べてみた結果、このような方法が見つかりました。

効果音の再生はJavaScriptにやらせて、JavaScriptの関数をJS.InvokeAsyncで呼び出そうというわけです。

wwwroot/index.html

XXX.razor

この方法ではmp3ファイルの再生中に新しい再生がはじまっても対応できません。そこで

wwwroot/index.html

XXX.razor

ただこの方法でも限界があり、再生が終わる前に新たに再生できるのは5回くらいまでです。

また任意の位置に画像を描画したいときはこのようにすればできます。

さてこれらを使えばBlazor WebAssemblyでTETRISをつくることも可能かもしれません。次回は実際につくってみることにします。

Blazor WebAssemblyでテトリスを作ろうとしたら残念な結果に