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



まずは、せっかく定義したTBitmapの、
生成と解放コードを書きましょう。
この裏画面は、ゲームが起動中ずっと必要で、
ゲーム終了時に不要になるので、
アプリの開始時&終了時しかタイミングがありません。
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;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   BackScreen.Free;
end;
Createのついでに、サイズの変更もしておきました。
ブラシとペンの謎のプロパティも固定値にしておきました。
タイマーはもう貼り付けてありますよね。
Intervalプロパティーを書き換えます。
さて、問題はここなのですが、
60fps出すなら、intervalは16です。
しかし、ここは30にしておきましょう。
60出ない気がするんで・・・
intervalは33に設定します。

img2.png

そしたら、onTimerイベントを記述しましょう。
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   with BackScreen.Canvas do begin
       Brush.Color:=clBlack;
       FillRect(Rect(0,0,150,300));
   end;
   PaintBox1.Canvas.Draw(0,0,BackScreen);
end;
with文は、参照の省略ですから、
       Brush.Color:=clBlack;
       FillRect(Rect(0,0,150,300));
は、 BackScreen.Canvas が付いていることになります。
ブラシを黒にして、それで画面を塗りつぶしています。
そのあと、PaintBoxのキャンバスにその黒い画面を転送して終了です。
これが秒間30回よばれるので、
PaintBoxでも、消えてもとにもどらない、ってことはないわけです。 

img3.png