Arduboyでスプライトを表示する
キャラクタの表示にdrawBitmap()は不向きのようだ。
画像の黒い部分が透けてしまって、重ね合わせると下の画像が見えてしまう。
調べてみると、Spritesクラスを使うと良いみたい。
いくつかメソッドが用意されているが、drawExternalMask()が意図した表示になった。
表示用の画像と、そのマスク画像を用意して、それぞれのデータをdrawExternalMask()で表示した。
ボールの境目に黒い線を表示したいので、マスク画像はボールよりも1ドット大きくしている。
【表示用】
【マスク用】
もう一つマスクが使えるdrawPlusMask()があり、これは画像データとマスクデータをまとめられるためデータの個数を少なくできる。
しかし画像データとマスクデータを交互に定義しなくてはならないので、すぐにデータが用意できず今回はパスした。
#include <Arduboy2.h> Arduboy2 arduboy; const unsigned char ball[] PROGMEM = { 16, 16, 0x00, 0xc0, 0xf0, 0xf8, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0x3c, 0x38, 0xf0, 0xc0, 0x00, 0x00, 0x03, 0x0f, 0x1f, 0x3f, 0x3f, 0x7f, 0x7f, 0x7f, 0x77, 0x37, 0x39, 0x1d, 0x0f, 0x03, 0x00, }; const unsigned char ballMask[] PROGMEM = { 0xc0, 0xf0, 0xf8, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xf8, 0xf0, 0xc0, 0x03, 0x0f, 0x1f, 0x3f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x3f, 0x1f, 0x0f, 0x03, }; void setup() { arduboy.begin(); arduboy.setFrameRate(60); arduboy.clear(); } void loop() { if (!arduboy.nextFrame()) return; arduboy.clear(); arduboy.fillRect(64, 0, 64, 64, WHITE); static int x, y; if (arduboy.pressed(LEFT_BUTTON)) { x -= 1; } else if (arduboy.pressed(RIGHT_BUTTON)) { x += 1; } if (arduboy.pressed(UP_BUTTON)) { y -= 1; } else if (arduboy.pressed(DOWN_BUTTON)) { y += 1; } Sprites::drawExternalMask(x, y, ball, ballMask, 0, 0); arduboy.display(); }