M5StickC PLUSでミニゲームを動かそうとして久々にC言語と格闘

JavaScriptのゲームライブラリcrisp-game-lib量産したミニゲームを、PCやスマホだけでなくて、何か小さなデバイスでも遊んでみたい。そう思って、移植性の高いC言語でライブラリを再実装してみている。

画面とボタンが付いていて入手が容易な小さなデバイスとして、まずはM5StickC PLUSで動かすことを目指してみた。いまのところ、まだ機能は限定的だが、いくつかのゲームが動くようになってきた。

小さなデバイス向けと言いながら、ブラウザでも遊べるようにしてある。C言語で書かれたゲーム本体ライブラリを、EmscriptenでビルドしてWebAssemblyファイルを生成し、JavaScriptのラッパを通じて動かしている。

バイス依存で実装しなければいけない関数は、machineDependent.hに定義してある。M5StickC PLUS向けの実装はこのヘッダファイル内の関数をC++で実装した。

ブラウザ向けの実装は、Emscripten--js-libraryオプションでブリッジのコードを指定してC言語側からJavaScript側の関数呼び出しを、JavaScript側からC言語側の関数はModule.ccallで呼び出している。

ブラウザで動くようにしておくと、いちいちデバイスへバイナリをビルド・転送する必要なく、PC上だけでデバッグ・動作確認できるのが、ゲーム開発の効率上も良い。Arduino IDEのビルドってなぜが非常に遅いし。ブリッジ部分でポインタのやり取りをしたり、Emscriptenコンパイラに与える適切なオプションを模索したりという部分はそれなりに面倒だが、それでもやっておく価値はある。

crisp-game-libの主要部分のみ実装して、簡単なゲームが動作するところまではできた。まだ色関係の機能、リプレイ、各種オプションなどが実装できてない。あと、BGMとか効果音の音周りは、デバイス側にリッチな音源が期待できないため、音の高さのみ制御可能な単音のブザーを想定した、新しい生成ロジックを作った。

crisp-game-lib-portable実装にあたって久々にC言語でプログラミングしたけど、TypeScriptのリッチな開発体験に慣れまくった身にはキツイ。char *str[][7]とか、よくこんな分けわからない変数宣言とつきあっていたな。これと比較すると任意のプロパティを生やせて配列も自在に足したり消したりできるJavaScriptのオブジェクト配列が神がかって見える。ポインタ周りの謎文法の数々や、デフォルト引数の無い関数、ガベコレに頼れないメモリ管理、ヘッダファイル、貧弱なモジュール管理、整数と浮動小数点間の変換に起因するバグ、ジェネリクスや言語サーバの不在、などなど、久々の苦行は楽しくもあり、懐かしくもあり、苦しくもあり、苦しくもあり、苦しい。

M5StickC PLUS以外にもう一つくらいターゲットデバイスがあると良さそうだけど、簡単に入手できて安価なデバイス、できればもうちょっと大きな画面と押しやすいボタン付き、という条件に当てはまるもの、あるかしらん。