Arduboyで固定小数点を扱う その1

固定小数点を使うことがあるかもしれないので、テスト。

符号1ビット、整数部7ビット、小数部8ビットにした。
整数部は7ビットなので-128〜127まで扱えるが、この値を単純に表示座標として使用すると、画面右の外側にキャラクタを置けない。
そこで、下駄を履かせて画面の中心(64, 32)を原点として考えることにした。

#include <Arduboy2.h>

Arduboy2 arduboy;

#define SCREEN_CENTER_X  64
#define SCREEN_CENTER_Y  32
#define SCREEN_TOP      -32
#define SCREEN_BOTTOM    31
#define SCREEN_LEFT     -64
#define SCREEN_RIGHT     63

void setup()
{
  arduboy.begin();
  arduboy.setFrameRate(60);
  arduboy.clear();
}

void loop()
{
  if (!arduboy.nextFrame()) return;
  arduboy.clear();

  static int16_t x, y;

  if (arduboy.pressed(LEFT_BUTTON)) {
    x -= 1 << 8;
    if (x >> 8 < SCREEN_LEFT) x = SCREEN_LEFT << 8;
  } else if (arduboy.pressed(RIGHT_BUTTON)) {
    x += 1 << 8;
    if (SCREEN_RIGHT < x >> 8) x = SCREEN_RIGHT << 8;
  }
  if (arduboy.pressed(UP_BUTTON)) {
    y -= 1 << 8;
    if (y >> 8 < SCREEN_TOP) y = SCREEN_TOP << 8;
  } else if (arduboy.pressed(DOWN_BUTTON)) {
    y += 1 << 8;
    if (SCREEN_BOTTOM < y >> 8) y = SCREEN_BOTTOM << 8;
  }
  arduboy.fillCircle((x >> 8) + SCREEN_CENTER_X,
                     (y >> 8) + SCREEN_CENTER_Y, 5, WHITE);

  arduboy.print("X="); arduboy.print(x >> 8); arduboy.print("\n");
  arduboy.print("Y="); arduboy.print(y >> 8); arduboy.print("\n");

  arduboy.display();
}