17 |
GameFSMの改良 (3) |
これはChatGPT5に作成して貰ったものですが、s1_bitsをunpackすると逆順になるためreverseしているとのことです。いずれにしろ、Cのような2次元の初期値定義は結局できないようなので、関数を使ったトリッキーな方法で行いました。
初期化部分:
typedef UInt#(8) U8;
typedef struct {
U8 sx; U8 sy;
U8 dx; U8 dy;
U8 w; U8 h;
} Glyph deriving (Bits, Eq, FShow);
// 位置指定で埋められるコンストラクタ関数
function Glyph mkGlyph(U8 sx, U8 sy, U8 dx, U8 dy, U8 w, U8 h);
return Glyph { sx:sx, sy:sy, dx:dx, dy:dy, w:w, h:h };
endfunction
// pack ∘ mkGlyph のラッパ(短い別名)
function Bit#(SizeOf#(Glyph)) pg(U8 sx, U8 sy, U8 dx, U8 dy, U8 w, U8 h);
return pack(mkGlyph(sx, sy, dx, dy, w, h));
endfunction
// s1: "PLA^SPACE__INVADERS"
Bit#(TMul#(19, SizeOf#(Glyph))) s1_bits = {
pg( 42,137,112, 68, 5, 7), // P
pg( 50,137,120, 68, 5, 7), // L
pg( 58,137,128, 68, 5, 7), // A
pg( 77,126,136, 68, 5, 7), // ^
pg( 66,137, 72, 93, 5, 7), // S
pg( 42,137, 80, 93, 5, 7), // P
pg( 58,137, 88, 93, 5, 7), // A
pg( 74,137, 96, 93, 5, 7), // C
pg( 82,137,104, 93, 5, 7), // E
pg( 42,129,112, 93, 5, 7), // _
pg( 42,129,120, 93, 5, 7), // _
pg( 90,137,128, 93, 5, 7), // I
pg( 98,137,136, 93, 5, 7), // N
pg(106,137,144, 93, 5, 7), // V
pg( 58,137,152, 93, 5, 7), // A
pg(114,137,160, 93, 5, 7), // D
pg( 82,137,168, 93, 5, 7), // E
pg(122,137,176, 93, 5, 7), // R
pg( 66,137,184, 93, 5, 7) // S
};
Vector#(19, Glyph) s1 = reverse(unpack(s1_bits));
描画部分:
function Stmt stringS1; // PLAY SPACE INVADERS
return (seq
for (str_idx <= 0; str_idx < 19; str_idx <= str_idx + 1) seq
copyGlyph(s1[str_idx]);
wait_timer(`TICK_WAIT8);
if (fbutton) break;
endseq // for
endseq);
endfunction
Leave a Comment