−トップへ−

ブロックくずしゲームを作る
その6 ボールでブロックを消す

 前回,ブロックを表示させましたが,今回はそのブロックをボールで消すことができるようにします。
 
 
 前回,下のようなブロックを表示させました。

 また,変数blockも宣言しましたが,今回それを使ってプログラムを書いていきます。
 
 ちなみに上の画面で,一番上のブロックは,左から
  block[0,0],block[1,0],block[2,0],…,block[9,0]
 2段目は左から
  block[0,1],block[1,1],block[2,1],…,block[9,1]
 3段目は左から
  block[0,2],block[1,2],block[2,2],…,block[9,2]
 
 を表しています。
 
 そして,「block[2,2]=true」ならブロックがあることを表し,「block[2,2]=false」ならブロックがないことを表すこととします。
 
 プログラムを書く場所は,Timer1Timerイベントハンドラです。

 procedure TForm1.Timer1Timer(Sender: TObject);
 var   i:integer; //←これを書き込む
 begin
  with image1.Canvas do begin
   //ボールがあった部分を黒く塗る
   brush.Color:=clblack;
   fillrect(rect(ballx,bally,ballx+balls,bally+balls));
  end;
  //ボールの新しい座標を求める
  if (ballx<=0) or (ballx>=image1.Width-balls) then bx:=-bx;
  ballx:=ballx+bx;
  if bally<=0 then by:=-by;
  bally:=bally+by;
  //ボールがラケットに当たったか調べる
  if bally>=raky-balls then
  begin
   if (ballx>=rakx) and (ballx<=rakx+rakw) then by:=-by;
  end;
  //ゲームオーバー
  if bally>=500 then
  begin
   timer1.Enabled:=false;
   with image1.Canvas do begin
    font.Color:=clred;
    font.Size:=30;
    textout((image1.Width-textwidth('Game Over')) div 2,200,'Game Over');
   end;
  end;
  //ブロックに当たったか調べる
  if (bally>=60) and (bally<=70) then begin //ボールが3段目の位置に来たとき
   i:=ballx div (image1.Width div 10); //ボールが左から何番目のブロックの位置にあるか求める
   if block[i,2]=true then begin //ブロックがあれば以下のプログラムを実行
    block[i,2]:=false; //ブロックを削除されたことにする
    by:=-by; //ボールの進む方向を反対にする
    with image1.Canvas do begin
     brush.Color:=clblack; //色を黒にして,ブロックを塗りつぶす
     fillrect(rect(i*(image1.Width div 10),60,(i+1)*(image1.Width div 10),70));
    end;
   end;
  end;
  if (bally>=40) and (bally<=50) then begin //ボールが2段目の位置に来たとき
   i:=ballx div (image1.Width div 10);   //以下のプログラムは3段目とほぼ同じ
   if block[i,1]=true then begin
    block[i,1]:=false;
    by:=-by;
    with image1.Canvas do begin
     brush.Color:=clblack;
     fillrect(rect(i*(image1.Width div 10),40,(i+1)*(image1.Width div 10),50));
    end;
   end;
  end;
  if (bally>=20) and (bally<=30) then begin //ボールが1段目の位置に来たとき
   i:=ballx div (image1.Width div 10); //以下のプログラムは3段目とほぼ同じ
   if block[i,0]=true then begin
    block[i,0]:=false;
    by:=-by;
    with image1.Canvas do begin
     brush.Color:=clblack;
     fillrect(rect(i*(image1.Width div 10),20,(i+1)*(image1.Width div 10),30));
    end;
   end;
  end;
  //bx,by進んだ位置にボールを描く
  with image1.Canvas do
  begin
   brush.Color:=clwhite;
   fillrect(rect(ballx,bally,ballx+balls,bally+balls));
  end;
  //ラケットを動かす
  if keyd<>0 then
  begin
   with image1.Canvas do begin
    brush.Color:=clblack;
    fillrect(rect(rakx,raky,rakx+rakw,raky+10));
    rakx:=rakx+keyd;
    brush.Color:=clwhite;
    fillrect(rect(rakx,raky,rakx+rakw,raky+10));
   end;
  end;
 end;

 これを実行すると,ボールがブロックに当たるとブロックが消え,ボールがはね返ります。
 
 これで一応遊ぶことはできますが,いくつか直すことがあります。
 
 ・ ブロックを全部消しても,まだボールが動き続ける。
 ・ ボールの動く角度が常に一定であり,ラケットでボールの進み具合を変えられない。
 ・ 現在,失敗すると「Game Over」と表示されるが,スペースキーを押すとボールが何度でも出てくる。
 
 これらの点を直してみたいと思います。

−トップへ−