C言語を使ったPlaydate向けゲーム開発(エア実装編)

screenshot

crisp-game-lib-portableのポータビリティを検証するために、Playdate用実装を作ることにした。実機を持ってないのに。

Playdateは黄色い筐体と横についたクランクがキュートなコンパクトなゲーム機だ。日本からもプレオーダーできるが今から頼んでも届くのは2023年となかなか手に入らない。でもSDKはあるので、シミュレータを使った開発はできる。

Arduinoではないデバイスでもcrisp-game-lib-portableが動くかどうかを確かめるにはちょうど良い。

まずC言語でPlaydate用ゲームを作る環境を整える。オフィシャルページにやり方が載っているが、Visual Studio入れて、 GNU Arm Embedded Toolchain compiler入れて、CMake入れてと結構面倒。以下のページの情報が役に立つ。

SDKの中にあるサンプルなどを参考にCMakeLists.txtを作ってVisual Studio用のソリューションファイルを作る必要がある。あとは.slnファイルを起動すればVisual Studio上でコードが書ける。構成マネージャーを見るとZERO_CHECKというよく分からんプロジェクトができているが、それはビルドから外して、それじゃない方をスタートアッププロジェクトに設定してみたが、これが正解かは分からない。

環境ができたらコードを書く。今回書いたコードは以下。

コードの作りとしては、イベントハンドラにPlaydate用の全てのAPIが生えたポインタが渡ってくるので、そこからさまざまな機能を呼び出す。

APIリファレンスに関数は書いてあるが、いくつかの機能はLua用のドキュメントを読んでおかないと分かりにくい点も多い。

FPSplaydate->display->setRefreshRateで指定できるが、どうも上限が50のようだ。ぜひ60にしたいのだが、性能上の制約だろうか。

グラフィックライブラリ用の機能はplaydate->graphics以下に一通りそろっているし、ビットマップキャラクタもLCDBitmapを使えば簡単に扱える。playdate->graphics->pushContextでビットマップを指定すれば任意のグラフィックスをビットマップに書き込める。

Playdateは白黒画面だが、それを補うために8x8のパターンで矩形などを塗りつぶす機能がある。そのためにLCDPatternを使うのだが……なんの説明もない。どうも16個あるuint8_tの前半8つが白黒のパターン、後半8つがマスクパターンのように思える。今回はこれを使ってRGBから無理やりパターンを作るロジックを作った。

音回りはよく分かってないのだが、playdate->sound->synth->newSynthPDSynthインスタンスが取れれば、playdate->sound->synth->playNoteで任意の周波数の音を、期間と開始時間を指定して鳴らせる。ちゃんとオーディオタイマーがあってスケジューリングしてくれるのは助かる。

コードが書ければVisual Studio上で「ローカルWindowsデバッガー」ボタンを押すだけでシミュレータが立ち上がってデバッグできる。この辺はとても楽で良い。ビルドもそれほど時間かからない。

次は実機向けのビルドだ。cmakeにArmターゲット用のオプションを付けてビルドすれば、実機に転送可能なバイナリができる。

ここに一つ罠があって、実機用ビルドではsprintftimeなどいくつかの関数が使えない。なのでそれら関数はPlaydateのAPIで補わないといけない。しょうがないので今回はCMakeLists.txtPlaydate実装向け定数を定義してライブラリ本体の実装を変えた。こうしてライブラリ本体は機種依存しない、という建前が崩れていく。まあブラウザ向けにEMSCRIPTEN_KEEPALIVEが必要な時点でそれは崩れてはいたのだが。

次は実機上でのテストだが……もちろんできてない。実機が無いから。何か実機固有の問題を踏んだり、パフォーマンス上の問題が出たりしそうだよなあ。

とりあえずシミュレータを使った開発の範囲だと、Visual Studioとシームレスに連携してくれることもあり開発体験は良い。ドキュメントはまあまあ充実しているが、LuaとCの間で情報が分散していたりして分かりにくい点もある。音回りはだいぶリッチな機能がありそうなのだが、全貌がよく分からない。だれかにWeb Audio APIとの対比で説明して欲しい。

あとはWindows上のシミュレータと実機の挙動の差が少ないのであれば全体としてよくできた開発環境であると思うのだが、そこが分からんので総合的な評価はできないね。その辺が書いてある記事とかネット上にあるかなあ。ちょっと検索した範囲だと、実機があまり出回ってないせいもあって、私と同じエア実装勢が多いような気がする。