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(); }