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

構造体と共用体を使って、固定小数点の扱いを少し楽にしてみた。

#include <Arduboy2.h>

Arduboy2 arduboy;

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

typedef struct WordPoint {
  uint16_t x;
  uint16_t y;
};

typedef struct BytePoint {
  uint8_t xl; // 小数部
  int8_t  xh; // 整数部
  uint8_t yl; // 小数部
  int8_t  yh; // 整数部
};

typedef union FixPoint {
  WordPoint w;
  BytePoint b;
};

#define X   w.x   // xの整数・小数部をひっくるめた値にアクセスする
#define Y   w.y   // yの整数・小数部をひっくるめた値にアクセスする
#define XH  b.xh  // xの整数部にアクセスする
#define XL  b.xl  // xの小数部にアクセスする
#define YH  b.yh  // yの整数部にアクセスする
#define YL  b.yl  // yの小数部にアクセスする

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

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

  static FixPoint pos;

  if (arduboy.pressed(LEFT_BUTTON)) {
    pos.X -= (1 << 8); // -1移動
    if (pos.XH < SCREEN_LEFT) pos.XH = SCREEN_LEFT;
  } else if (arduboy.pressed(RIGHT_BUTTON)) {
    pos.X += (1 << 7); // 0.5移動
    if (pos.XH > SCREEN_RIGHT) pos.XH = SCREEN_RIGHT;
  }
  if (arduboy.pressed(UP_BUTTON)) {
    pos.Y -= (1 << 6); // -0.25移動
    if (pos.YH < SCREEN_TOP) pos.YH = SCREEN_TOP;
  } else if (arduboy.pressed(DOWN_BUTTON)) {
    pos.Y += (1 << 5); // 0.125移動
    if (pos.YH > SCREEN_BOTTOM) pos.YH = SCREEN_BOTTOM;
  }
  arduboy.fillCircle(pos.XH + SCREEN_CENTER_X, pos.YH + SCREEN_CENTER_Y, 5, WHITE);

  arduboy.print("X="); arduboy.print(pos.XH); arduboy.print("\n");
  arduboy.print("Y="); arduboy.print(pos.YH); arduboy.print("\n");

  arduboy.display();
}