Arduboy でゲーム制作 Part 2 ビットマップの表示の仕方
最近わかったことがあります。睡眠導入剤を服用しているのですが、最近は服用しなかった日は寝過ぎてしまうことがなく、中途覚醒もなくなりました。眠剤なしでしばらく行けそうです。これは大きな進歩なのでやる気がみなぎりました!
今日作ったのは先日の↓の続き。
途中まではそれっぽく動いて、ゲームとして遊べたのですが、メモリや処理能力上の問題が出たため工夫を施した途端とてもバグが多くなってしまいました。これではまだゲームとして遊べませんね。
Arduboy の性能は昨今のコンピュータの中では非常に低スペックなので、現代的な富豪的プログラミング(節約せず作りやすさを優先した手法)は通用しません。しませんでした。それに気づくのがちょっと遅かったですね。数バイトの型の配列を300個用意したら動かなくなった、というようなことが発生してしまうのです。
なので、例えばですが、永遠に右へ続く地形はリングバッファというデータ構造とアルゴリズムを用いて実装し直しましたし、それ以外にもいくつか工夫を行うことになりました。しかし、Arduino は組み込みキットです。C++ が使えますが ISO/IEC が制定している標準ライブラリは提供されていません。使えるのはこのようなライブラリとユーザが公開しているライブラリだけです。
なので基本的には必要なものは自分で作ることになります。アルゴリズム系は普段から実装はするのですが、だいたいの場合はリッチなデータ構造が事前に用意されていて、やはり低レベル(ハードウェア寄り)のコーディングは面倒です。作りやすい方法で作るとオーバーヘッドが大きくなってしまうので、シンプルかつ高速なものをよく考えて実装しなければなりません。スマートポインタであったり、イテレータであったり、そういうレベルから自作するのは最近ではほとんどやってませんでしたから、今日はエネルギー切れです。
それと、今日知った Arduboy のライブラリの使い方でビットマップの表示方法がわかりやすく説明されているサイトを見つけたのでそちらをご紹介して終わりたいと思います。
Arduboy でのビットマップの表示の仕方
Arduboy でビットマップを表示する方法はこちらの解説がとてもわかり易く助かりました。英語なのでこちらでも簡単に紹介したいと思います。
※前提として Arduboy で drawLine や drawCircle などで描画ができるような状態まで作れているとします。
まずは白黒のビットマップを用意します。例えば 8x8 のグレースケールのビットマップを作ります。
このような画像を下記のサイトにアップロードします。設定は、画像のサイズが一致するように変更する以外は不要です。
出力結果がカンマ区切りの16進数になるので、それをそのままC言語のソースコードにコピペすることになります。ソースコードには次のように書きます。
const unsigned char player_bmp[] PROGMEM = {
0xa0, 0x28, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38,
};
要注意な点があります。この宣言には PROGMEM を指定する必要があります。 Arduboy というか、Arduino にはいくつかの種類のメモリがあります。SRAM, PROGMEM, EEPROM といったメモリがあり、ビットマップは PROGMEM(プログラムメモリ) に配置されなければなりません。
描画するときのコードは次のようになります。
arduboy.drawBitmap(x, y, player_bmp, 8, 8, WHITE);
arduboy は Arduboy2.h に宣言されている Arduboy2 クラスのインスタンスです。x, y はビットマップの表示されるスクリーンの左上の座標、player_bmp は先程宣言したビットマップデータのポインタ、8, 8 は画像の幅と高さ、WHITE は白です。
非常に簡単ですね。
それでは。