🦄はじめに このシリーズについて
私は以前からゲームを作ってみたいと思っていたのですが、そんなときにWASM-4というゲーム開発フレームワーク(プラットフォーム?ゲームエンジン?)を知って興味がわいたので、これを使ってゲーム開発をやってみることにします。最近興味を持っている幾つかの技術の勉強も兼ねて、今回の目的は次の3つに定めました。
- ゲーム作りたい(完成させたい)
- 興味はあるけどまだろくに触れていないRust/WebAssemblyに触りたい
- 最近技術的な記事を書いていないので記事を書くネタにしたい
ゲーム開発はやってみるととても大変で、なかなか完成までに至りません。筆者はすでに一度Qiita内でゲーム開発を挫折しているという体たらくですし、今回は完走を何より重視していきたいと思います。以前のシリーズにもし興味がある方がいらっしゃいましたらそちらの記事もどうぞ。純粋関数型プログラミング言語でマインクラフトみたいなゲームを作っていく記事です。
そんなわけでこの新シリーズ『ラストのまほう』では、私が今回のゲーム制作で学んだ実践的な知識や技術の紹介をすることで、読者のみなさまにWASM-4やRustに興味を持ってもらえたらいいなと思っています。
ちなみにこのシリーズのタイトルは、同人ゲーム制作にはげむ高校生たちの青春を描く名作『ステラのまほう』が元ネタになっております。「WASMのまほう」と「Rustのまほう」のどちらにするか悩みましたが、元ネタと語感が近い方にしました。
このシリーズは私の2022年ひとりアドベントカレンダーの記事でもありますので、25日完走できるようにどうか応援とかをお願いします。
🎮WASM-4とは
最初のこの記事は、WASM-4の紹介から始めたいと思います。この記事の執筆時点で日本語圏でWASM-4に関する記事は皆無なので聞いたことがないという人も多いでしょうが、WASM-4はゲーム開発フレームワークのひとつです。どんなゲームを作れるのかは、公式サイトのゲーム紹介ページをみると一目瞭然です。
WASM-4公式サイト
ゲーム紹介ページ
スクリーンショットでわかるひともいると思うのですが、初代ゲームボーイのような見た目のゲームばかりです。WASM-4には次のような制限があえて設けられています。
- 解像度は160ピクセルx160ピクセル。ゲームボーイのディスプレイと横幅が同じで、縦が少し伸ばして正方形にした感じ
- 色数もゲームボーイと同じで、同時発色数は最大4色しかありません(ただし、カラーパレットを指定できるので、色の構成を変えることはできます)
- ユーザーからの入力操作は、十字キーとボタン1、ボタン2のみ。スタートボタン、セレクトボタンすらありません
- 音源は矩形波や三角波などの波形しか出せません。しかも最大4チャンネルしかありません。ピロピロとかザーという機械的で簡素な音しか出せず、同時に最大4音までということです。この仕様もゲームボーイと同様らしいです
- ゲームデータのサイズは64キロバイトまで。あんまり画像をジャブジャブ使うことはできないということですね。ゲームボーイソフトは初代ポケモンで512キロバイトとからしいので、それよりもずいぶん厳しいです。実行時のメモリ空間(RAM)も64キロバイトまでですが、これはゲームボーイよりはマシです
このようなレトロゲーム的な表現力にあえて絞ったゲーム開発フレームワークは他にもあり、それらは「ファンタジーゲームコンソール」と呼ばれていて、有名なものには PICO-8 や TIC-80、 pyxel などがあります。PICO-8製で有名なものとしては、SwitchやPlayStationでも販売されているCelesteはもともとPICO-8でプロトタイプが制作されていたそうです。
WASM-4はそれらのなかでもひときわシンプルなファンタジーコンソールで、そのためフレームワーク自体の習得が非常に簡単です。なにしろWASM-4のAPIの関数は全部で12個しかないほどです。フレームワークのバージョンアップに伴う仕様変更で苦労することもきっとないでしょう。
ファンタジーコンソールには、現代のハードウェア上であえて表現力を抑えることで、ゲームの本質の開発にフォーカスして、ゲーム開発をちゃんと完結させよう、という趣旨もあります。ゲーム開発はつい欲が出て多くの要素を盛り込んだり、高い品質を目指してグラフィックスを作り込んだりしてしまい、結局それで作業量が多くなりすぎてゲーム開発に挫折しがちです。その点、WASM-4のようなファンタジーコンソールは制限が強いぶんさまざまな面で諦めがつくので、寄り道せずゲームを完成まで持っていける可能性が高いといえます。たぶん……。
🕸️WASM-4とWASM
WASM-4はその名の通り WebAssembly(WASM) をゲームプログラムの表現として使います。WASMはユニバーサルなバイナリ形式のプログラムであり、一度WASMモジュールへとコンパイルすればそのWASMモジュールはハードウェアやOSを問わずほとんどあらゆるプラットフォームで実行可能になります。また、実行速度はネイティブコードに近い、特定のプログラミング言語に依存しない、サンドボックス化された環境で安全に実行できるなど、さまざまな優れた特徴があります。このWASMの力を体験してみたいと思ったのも、WASM-4に興味を持った理由です。
WASM-4ではRustなどの言語のコードをコンパイルした WASM モジュールはカートリッジと呼ばれ、そのカートリッジをランタイムに読み込ませることでゲームを実行します。WASMの実行環境はブラウザのほかにもwasmtimeやwasmerのようなWASMランタイムがありますが、WASM-4はゲーム専用に設計されたWASMランタイムの一種であるともいえるわけです。
WASM-4で作ったゲームは単一のHTMLファイルへとバンドルしてPCやスマホなどのウェブブラウザ上で実行できるだけでなく、ネイティブアプリとしてバンドルして配布もできますし、PS VitaやSwitchのようなゲーム機で動かしている人もいるようです。たった12個の関数を実装するだけでWASM-4ランタイムを実装できるので、新たなデバイスに対応させるのも簡単です。
🔜次回予告
今回はWASM-4の概要の紹介だけをしました。どういうゲームを作っていくかや、具体的なプログラミングについては、次回以降に紹介していくつもりです。第一話はコードが1行もない記事になってしまいましたが、QiitaはポエムOKになった(拡大解釈)のでたぶん大丈夫でしょう。次回は、なぜRustを選んだのかの話をしたり、RustでのWASM-4開発環境の構築などの具体的な作業をやっていきます。実は少しは記事を書き溜めて予約投稿してあるので、しばらくは毎朝新しい記事が公開されると思います。