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



事前計画では、
残りは、
端で回転するときに内側に寄せる処理と、
後は消える処理です。
投票所には消える処理の無いテトリス
と書いてありましたが、
ここまできて消えないのもムラムラするので実装します。
しかし、
せっかく消えるようになっても、
のろのろ積んでいたんじゃつまりません。
やはり、消えるようになる前に、
自分でさっさと落とす処理を作りましょう。
これは案外簡単です。
今、落下処理は、落下カウンタが満タンになったら一段落ちる
というようになっています。
ですから、落下ボタンを押している間、
カウンタの上昇を早めてやればよいのです。
まずは下キーのセットを作ります。
   TPiece = Class(TObject)
   private
   public
       (略)
       k_left,k_right:integer;
       k_z,k_x:integer;
       k_down:integer;
       (略)
   end;
procedure TPiece.Main;
begin

   if GetKeyState(VK_LEFT)<0 then k_left:=k_left+1 else k_left:=0;
   if GetKeyState(VK_RIGHT)<0 then k_right:=k_right+1 else k_right:=0;

   if GetKeyState(Ord('Z'))<0 then k_z:=k_z+1 else k_z:=0;
   if GetKeyState(Ord('X'))<0 then k_x:=k_x+1 else k_x:=0;

   if GetKeyState(VK_DOWN)<0 then k_down:=k_down+1 else k_down:=0;
   (略)
end;
この一連の処理は、
なんども作ったのでわかるでしょう。
カーソルキー下のコードはVK_DOWNです。
さて、落下速度を速める前に、
一箇所だけ訂正します。
   d_counter:=d_counter+1;         //1増える
   if d_counter=d_max then begin
       d_counter:=0;               //maxになったら即リセット
   end;
この、満タンになったら、という部分を
   d_counter:=d_counter+1;         //1増える
   if d_counter>=d_max then begin
       d_counter:=0;               //max以上になったら即リセット
   end;
というように、
リセットの条件を、満タンぴったりから、満タン以上、に変えます。
落下カウンタの回す速度を増やす、ということは、
一度に1以上増えるということなので、
タイミングによってはd_maxぴったりにならないことがあるからです。
さて、
キー入力の条件ですが、
「キーを押し続けている」
というのはどういう状態でしょうか。
カウンタは押され始めてから0,1,2...
と増えていくので、
「0より大きいときは押されている」
ということなのです。
では、それを踏まえて、
   d_counter:=d_counter+1;         //1増える
   if d_counter>=d_max then begin
       d_counter:=0;               //max以上になったら即リセット
   end;
    d_counter:=d_counter+1;         //1増える

   if k_down>0 then begin
       d_counter:=d_counter+4;     //下を押してたらさらに4増える
   end;

   if d_counter>=d_max then begin
       d_counter:=0;               //max以上になったら即リセット
   end;
と編集しましょう。
これで、下を押してれば5倍速になります。(1+4で5

img2.png

次回はいよいよラインを消します