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



えー、実は、新しいピースを出す処理は、
かな〜り簡単です。
ピースの、生成と解放部分をもう一度見て見ましょう。
Form.onCreate で
   Piece:=TPiece.Create;
   Piece.Init(5,-3,5,MapBlocks);
   SetRandomShapeToPiece(Piece);
と、生成、初期化、形状決定
とします。
メインルーチンで
   if Assigned(Piece) then begin
       Piece.Main;
       if Piece.death then begin
           FreeAndNil(Piece);
       end;
   end;
死亡フラグがあればFreeAndNil。
いやぁ、実は、
ここのFreeAndNilの後に、
生成、初期化、形状決定
の処理をつけるだけですwwwww
でも、実はそれだとちょっと心配なことがあります。
ゲームオーバーの状態では、
満タンまで積もってるわけですから、
生成してしまうと、次のフレームで即死します。
別に問題は無いんですが、
ゲームが終わった状態で、
内部的に、
「死亡→生成、死亡→生成、死亡→生成・・・」
って毎フレームせかせかしてるのは、
やっぱキモチワルイですよね。
いえ、でもさらに大丈夫なんです。
死んだフレームでは、ゲームオーバー処理のあと
アプリを落としてしまうので、
「ゲームオーバー後のフレーム」
なんてものは存在しません。
でも、やっぱ、なんとなく、平気だけど、ああん
俺の性格だ プログラミングの。うん。
以下のようにしておきましょう。
   if Assigned(Piece) then begin
       Piece.Main;
       if Piece.death then begin
           FreeAndNil(Piece);
           if not MapBlocks.GameOver then begin//ゲームオーバーじゃないなら次を産む
               Piece:=TPiece.Create;
               Piece.Init(5,-3,30,MapBlocks);
               SetRandomShapeToPiece(Piece);
           end;
       end;
   end;
えー、実行してみたら、
showmessageが高速ででまくってひどいことになりました・・・・
    if MapBlocks.GameOver then begin
       showmessage('m@(^Д^)プギャー 死んでやがるwwwアヒャヒャヒャヒャ');
       Close;
       Exit;
   end;
のところを修正します。
   if MapBlocks.GameOver then begin
       Timer1.Enabled:=False;
       showmessage('m@(^Д^)プギャー 死んでやがるwwwアヒャヒャヒャヒャ');
       Close;
       Exit;
   end;
showmessageの前にタイマーをオフにしちゃいます。
Enabledは、コンポーネントの、
「使用する」フラグでしたね。偽、にすれば、止まります。
さぁ、実行してみましょう。
鑑賞専門ですが・・・w

img2.png