コラム / テトリスぽいもの / 11



TMapBlocksのインスタンスを生成しましょう。
まだ変数が定義されてないので、
Formのpublicに追加します。
  public
   { Public 宣言 }
   BackScreen:TBitmap;
   b_img:TBitmap;
   MapBlocks:TMapBlocks;
   procedure CopyBlockImageToField(x,y:integer;block:TBitmap);
 end;
procedureより上です。注意してください。
では、生成、解放部分を書きましょう。
FormのonCreate/onCloseです。
procedure TForm1.FormCreate(Sender: TObject);
begin
   BackScreen:=TBitmap.Create;
   BackScreen.Width:=150;
   BackScreen.Height:=300;
   BackScreen.Canvas.Brush.Style:=bsSolid;
   BackScreen.Canvas.Pen.Style:=psSolid;
   BackScreen.Canvas.Pen.Mode:=pmCopy;

   b_img:=TBitmap.Create;
   b_img.LoadFromFile(
       ExtractFilePath(Application.ExeName)+'block.bmp'
   );

   MapBlocks:=TMapBlocks.Create;
   MapBlocks.Blocks[19,2]:=True;
   MapBlocks.Blocks[19,3]:=True;
   MapBlocks.Blocks[19,4]:=True;
   MapBlocks.Blocks[19,5]:=True;
   MapBlocks.Blocks[19,6]:=True;
   MapBlocks.Blocks[18,3]:=True;
   MapBlocks.Blocks[18,4]:=True;
   MapBlocks.Blocks[18,5]:=True;
   MapBlocks.Blocks[17,4]:=True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   MapBlocks.Free;

   b_img.Free;
   BackScreen.Free;
end;
なんか、だらだらとBlocksをいじっていますが、
テストのためなので、最終的には取ります。
そしたら、いよいよ表示させましょう。
Timer1.onTimerのメインルーチンを編集します。
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   with BackScreen.Canvas do begin
       Brush.Color:=clBlack;
       FillRect(Rect(0,0,150,300));
   end;

   MapBlocks.Draw;

   PaintBox1.Canvas.Draw(0,0,BackScreen);
end;
with の部分は、画面塗りつぶし、
PaintBoxは、裏画面転送ですから、
その間に書くわけです。
おおっと、うまくいかないと思ったらバグがあった。
function    TMapBlocks.isBlock(x,y:integer):Boolean;
の最後の行を、
   Result:=Blocks[x,y];//そのまま返す
   Result:=Blocks[y,x];//そのまま返す
いやぁ、Blocksの定義、yが先なのは絶対ミスでしたね。
どんまいどんまい。
これで実行すると、

img4.png

っぽくなってきましたよ。。。