ラストのまほう　第１話『WASM-4とは』

![wasm4.org_(iPad Air) (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64695/f3edaa8e-bcfc-9554-aba0-caa382652496.png)

# 🦄はじめに　このシリーズについて

私は以前からゲームを作ってみたいと思っていたのですが、そんなときに[**WASM-4**](https://wasm4.org/)というゲーム開発フレームワーク(プラットフォーム？ゲームエンジン？)を知って興味がわいたので、これを使ってゲーム開発をやってみることにします。最近興味を持っている幾つかの技術の勉強も兼ねて、今回の目的は次の３つに定めました。

- ゲーム作りたい(完成させたい)
- 興味はあるけどまだろくに触れていないRust/WebAssemblyに触りたい
- 最近技術的な記事を書いていないので記事を書くネタにしたい

ゲーム開発はやってみるととても大変で、なかなか完成までに至りません。筆者は**すでに一度Qiita内でゲーム開発を挫折している**という体たらくですし、今回は完走を何より重視していきたいと思います。以前のシリーズにもし興味がある方がいらっしゃいましたらそちらの記事もどうぞ。純粋関数型プログラミング言語でマインクラフトみたいなゲームを作っていく記事です。

https://qiita.com/hiruberuto/items/5321d8cebce7b87851f6

そんなわけでこの新シリーズ『**ラストのまほう**』では、私が今回のゲーム制作で学んだ実践的な知識や技術の紹介をすることで、読者のみなさまにWASM-4やRustに興味を持ってもらえたらいいなと思っています。

ちなみにこのシリーズのタイトルは、同人ゲーム制作にはげむ高校生たちの青春を描く名作『**[ステラのまほう](http://www.dokidokivisual.com/magic_of_stella/)**』が元ネタになっております。「WASMのまほう」と「Rustのまほう」のどちらにするか悩みましたが、元ネタと語感が近い方にしました。

このシリーズは[私の2022年ひとりアドベントカレンダー](https://qiita.com/advent-calendar/2022/wasm4)の記事でもありますので、25日完走できるようにどうか応援とかをお願いします。

# 🎮WASM-4とは

最初のこの記事は、**WASM-4**の紹介から始めたいと思います。この記事の執筆時点で日本語圏でWASM-4に関する記事は**皆無**なので聞いたことがないという人も多いでしょうが、WASM-4はゲーム開発フレームワークのひとつです。どんなゲームを作れるのかは、公式サイトのゲーム紹介ページをみると一目瞭然です。

###### WASM-4公式サイト 

https://wasm4.org/

###### ゲーム紹介ページ 

https://wasm4.org/play

スクリーンショットでわかるひともいると思うのですが、**初代ゲームボーイ**のような見た目のゲームばかりです。WASM-4には次のような制限があえて設けられています。

* 解像度は**160ピクセルx160ピクセル**。ゲームボーイのディスプレイと横幅が同じで、縦が少し伸ばして正方形にした感じ
* 色数もゲームボーイと同じで、**同時発色数は最大4色**しかありません（ただし、カラーパレットを指定できるので、色の構成を変えることはできます）
* **ユーザーからの入力操作は、十字キーとボタン1、ボタン2のみ**。スタートボタン、セレクトボタンすらありません
* **音源は矩形波や三角波などの波形しか出せません**。しかも最大４チャンネルしかありません。ピロピロとかザーという機械的で簡素な音しか出せず、同時に最大４音までということです。この仕様もゲームボーイと同様らしいです
* **ゲームデータのサイズは64キロバイト**まで。あんまり画像をジャブジャブ使うことはできないということですね。ゲームボーイソフトは初代ポケモンで512キロバイトとからしいので、それよりもずいぶん厳しいです。実行時のメモリ空間(RAM)も64キロバイトまでですが、これはゲームボーイよりはマシです

このようなレトロゲーム的な表現力にあえて絞ったゲーム開発フレームワークは他にもあり、それらは「**ファンタジーゲームコンソール**」と呼ばれていて、有名なものには [PICO-8](https://www.lexaloffle.com/pico-8.php) や [TIC-80](https://nesbox.itch.io/tic80)、 [pyxel](https://github.com/kitao/pyxel) などがあります。PICO-8製で有名なものとしては、SwitchやPlayStationでも販売されている[Celeste](https://celestegame.jp/)はもともと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](https://github.com/bytecodealliance/wasmtime)や[wasmer](https://github.com/wasmerio/wasmer)のようなWASMランタイムがありますが、WASM-4はゲーム専用に設計されたWASMランタイムの一種であるともいえるわけです。

WASM-4で作ったゲームは単一のHTMLファイルへとバンドルしてPCやスマホなどのウェブブラウザ上で実行できるだけでなく、ネイティブアプリとしてバンドルして配布もできますし、[PS VitaやSwitchのようなゲーム機で動かしている人](https://twitter.com/wasm4_org/status/1483140582943956992)もいるようです。たった12個の関数を実装するだけでWASM-4ランタイムを実装できるので、新たなデバイスに対応させるのも簡単です。

# 🔜次回予告

今回はWASM-4の概要の紹介だけをしました。どういうゲームを作っていくかや、具体的なプログラミングについては、次回以降に紹介していくつもりです。第一話はコードが1行もない記事になってしまいましたが、QiitaはポエムOKになった(拡大解釈)のでたぶん大丈夫でしょう。次回は、なぜRustを選んだのかの話をしたり、RustでのWASM-4開発環境の構築などの具体的な作業をやっていきます。実は少しは記事を書き溜めて予約投稿してあるので、しばらくは毎朝新しい記事が公開されると思います。

https://qiita.com/hiruberuto/items/17944972e05f6fd575d8