Article #1023

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.

GameFSMの改良 (3)

posted by sakurai on September 17, 2025 #1023

これは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

Your email address will not be published.

You may use Markdown syntax. If you include an ad such as http://, it will be invalidated by our AI system.

Please enter the numbers as they are shown in the image above.