Arduboyでスプライトを表示する

キャラクタの表示にdrawBitmap()は不向きのようだ。
画像の黒い部分が透けてしまって、重ね合わせると下の画像が見えてしまう。

調べてみると、Spritesクラスを使うと良いみたい。

いくつかメソッドが用意されているが、drawExternalMask()が意図した表示になった。
f:id:raohu69:20180317202342p:plain
表示用の画像と、そのマスク画像を用意して、それぞれのデータをdrawExternalMask()で表示した。
ボールの境目に黒い線を表示したいので、マスク画像はボールよりも1ドット大きくしている。
【表示用】
f:id:raohu69:20180317203929p:plain
【マスク用】
f:id:raohu69:20180317203601p:plain

もう一つマスクが使える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();
}