今回はライブラリのdrawBitmap関数を使います。
変換は手軽なウェブページ上で行います。
Chromeブラウザ専用です。持ってない方はお手数ですがインストールをお願いします。
■手順
- 画像を右クリック → 「画像をコピー」を選択。
- fuopyさんのページを開いてください。
- Ctrl + v(ペースト)すると、ページ上に画像が表示されます。
- 画像をクリックすればテキストにコピーされます。
あとはIDE上で必要な部分にCtrl + v してください。
#include <Arduboy.h>
const static unsigned char img[] PROGMEM =
{
0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc,
0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc,
0xfc, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0xf0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f,
0x3f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x3f,
0x3e, 0x1c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
};
Arduboy ab;
void setup()
{
ab.beginNoLogo();
ab.setFrameRate(30);
ab.clear();
ab.drawBitmap(0, 0, img, 32, 32, 1);
ab.display();
}
void loop()
{
if(!(ab.nextFrame()))
{
return;
}
// EMPTY
}
変換するのが大量にある場合、img2ardを使ってください。
別途、自作してみるのもいいと思います。
もう1つ画像を用意してアニメーションさせてみましょう。
#include <Arduboy.h>
const static unsigned char img0[] PROGMEM =
{
0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc,
0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc,
0xfc, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0xf0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f,
0x3f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x3f,
0x3e, 0x1c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const static unsigned char img1[] PROGMEM =
{
0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc,
0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc,
0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00,
0xf0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x7f, 0x7f, 0x3f, 0x3f, 0x1f, 0x1f, 0x0f,
0x0f, 0x07, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00,
0x0f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfe, 0xfc, 0xfc, 0xf8, 0xf8, 0xf0, 0xf0, 0xe0,
0xe0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f,
0x3f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x3f,
0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x00,
};
Arduboy ab;
uint8_t frame = 0;
void setup()
{
ab.beginNoLogo();
ab.setFrameRate(30);
}
void loop()
{
if(!(ab.nextFrame()))
{
return;
}
ab.clear();
if(frame >= 15)
{
ab.drawBitmap(0, 0, img0, 32, 32, 1);
}
else
{
ab.drawBitmap(0, 0, img1, 32, 32, 1);
}
ab.display();
if(++frame > 30)
{
frame = 0;
}
}
ちなみにこれは、口が開いたり閉じたりする黄色のキャラクタではなく、
ホールケーキが増えたり減ったりアニメーションです(汗。
・・・さて、ちょっとゲームを作ったことがある方なら、drawBitmapの引数や、
描画関連全体に不満が出てくると思います。
・引数uint8_t w, hはコード側ではなくて、データ側に持たすべきでは?
・マスクビット用の関数がほしい。背景の上に書いたら潰れません?
・アニメーションしたいときはどうするの?
・ハード的にできなくてもスプライトはないの?
この辺りの答えは、今のところTeam a.r.gさんのコードにありそうです。
私としてはそのうちパクろうと考えています。