ブロックくずしゲームを作る
その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」と表示されるが,スペースキーを押すとボールが何度でも出てくる。
これらの点を直してみたいと思います。