Arduboy

Arduboy2ライブラリのスプライトフォーマットはちょっと不思議

More than 1 year has passed since last update.

Arduboyをさわり始めた。
パタパタアニメを楽に実装しようと思うとフレーム指定で描画を切り替えられるスプライトを使いたくなる。
ろくにドキュメントを読まないとまずはまる点はスプライトのデータはArduboy.drawSlowXYBitmap()で使用するビットマップデータとは形式が違うということ。

開発フォーラムにスプライト用のデータを出力できるツールの投稿があった。
これを使って変換すればデータを得ることができる。
もちろん他にも存在すると思う。
ともあれこのツールのおかげでデータの構成を把握することができた。

データの基本構造は

  • 1バイト目: スプライトの幅
  • 2バイト目: スプライトの高さ
  • 3バイト目以降がスプライトのビットマップデータ ✕ N

となる。
マスクデータも同時に保持する形式もあるが今回はSprites.drawSelfMasked()で使用するデータを想定。(なお複雑な画像を重ねるゲームの場合はおそらくマスクデータをきちんと使いこなす必要がある)

ツールを使っていれば特に気にすることもないと思うがビットマップデータの変換ルールが独特な点をちょっと解説。

次のような画像があったとする。
t.png

Arduboy.drawSlowXYBitmap()用のビットマップはこの向きのまま左上から0/1に変換すればよい。
ところがSprites.drawSelfMasked()用のビットマップはちょっとおもしろい変換ルールになっている。
先ほどの画像は次のように左に90度回転した上で8ピクセル毎の垂れ幕の様に切り出して0/1に変換する。
t-turned.png

なんだかちょっと不思議なフォーマットで将来的に改良されるかもしれないが2017/05/07時点では上記の通り。

私は絵を修正するたびにGUIツールを使うのは面倒なので自分用にコマンドラインツールを作ってしまった。なお機能的にはまだ最低限。ドキュメントもないという惨状。