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



さて、先に進む前に、
ちょいと整理しましょう。
今、初期化処理がこの上なくうんこです。
MapBlocksは、初期ブロックは飾りだったので、
もう消しちゃいましょう。
Create以外の部分を消します。
   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;
   MapBlocks:=TMapBlocks.Create;
で、ピースですが、
これはこれ以上命令数を減らすのは無理なので、
「初期化手続き」 てなもんを作ってみましょう。
宣言部に戻り、TPieceの宣言を編集します。
   TPiece = Class(TObject)
   private
   public
       (略)
       death:Boolean;

       procedure Init(_x,_y,dm:Integer;mb:TMapBlocks);

       procedure Draw;
       (略)
   end;
さて、引数の意味を見て見ましょう。
型宣言は、
_xと_yとdmがinteger mbがTMapBlocks となってます。
(同じ型はコンマで列挙、違う型との区切りはセミコロンですね
_x 初期化して代入するx座標です。
引数の名前を x にすると、ダブってしまって後で困るので _をつけてみました。
_y 初期化して代入するy座標です。
_をつけたのは上と同じ理由。
dm d_max の略です。初期化してd_maxに入れる値です。
mb MapBlocksの略です。 初期化する時にMapBlocksに入れる値です。
じゃぁ実装しましょう。
procedure TPiece.Init(_x,_y,dm:Integer;mb:TMapBlocks);
begin
   x:=_x;
   y:=_y;
   d_counter:=0;
   d_max:=dm;
   MapBlocks:=mb;
   death:=False;
end;
定義部で宣言した引数をそのまま移すだけです。
d_counterとdeathは初期値が、0,Falseとそれぞれ決まっているので、
直接代入して初期化です。
さっそく使ってみます。
Form.onCreateの初期化部を編集
procedure TForm1.FormCreate(Sender: TObject);
begin
   (略)
   Piece:=TPiece.Create;
   Piece.x:=5;
   Piece.y:=-3;
   Piece.d_counter:=0;
   Piece.d_max:=30;//30フレーム、つまり1秒
   Piece.shape[0,1]:=True;
   Piece.shape[1,1]:=True;
   Piece.shape[2,1]:=True;
   Piece.shape[2,2]:=True;
   Piece.MapBlocks:=MapBlocks;
   Piece.death:=False;
   (略)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   (略)
   Piece:=TPiece.Create;
   Piece.x:=5;
   Piece.y:=-3;
   Piece.d_counter:=0;
   Piece.d_max:=30;//30フレーム、つまり1秒
   Piece.shape[0,1]:=True;
   Piece.shape[1,1]:=True;
   Piece.shape[2,1]:=True;
   Piece.shape[2,2]:=True;
   Piece.MapBlocks:=MapBlocks;
   Piece.death:=False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   (略)
   Piece:=TPiece.Create;
   Piece.Init(5,-3,30,MapBlocks);
   Piece.shape[0,1]:=True;
   Piece.shape[1,1]:=True;
   Piece.shape[2,1]:=True;
   Piece.shape[2,2]:=True;
end;
少しマシになりましたね。
形データの管理については、もうすこし後で整理します。