ブロックくずしゲームを作る
その5 ブロックの表示
今回は,ブロックを表示させてみます。
ブロックは,ゲームを始めるときやすべてクリアしたときなど,いろいろな場面で表示させますので,イベントハンドラの中に書かず,別のところに書いておきたいと思います。
新しい手続き(procedure)を作成する
今まで,イベントハンドラの中にプログラムを書いてきましたが,これらは「procedure TForm1.FormCreate(Sender: TObject);」などで始まります。
これらは「procedure」という言葉で始まっていますが,これを新たに作成してみたいと思います。
ここでは,「makeblock」という名前で手続きを登録してみたいと思います。
unit test1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Timer1: TTimer;
procedure makeBlock; //←これを書き込む
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Image1Click(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private 宣言 }
ballx,bally,bx,by,balls:integer;
rakx,raky,rakw,keyd:integer;
block:array[0..9,0..2] of boolean; //←これも書き込む
public
{ Public 宣言 }
end;
「procedure makeBlock;」は「type」と「private」の間ならどこでもかまいません。
次に「procedure makeBlock;」の後ろにカーソルがある状態で,[Ctrl]+[Shift]+[C]を押すと,新しいprocedureが作成されます。
次にブロックが消されたかどうかを記録するための変数を宣言します。場所は{ Private 宣言 }の場所です。
そこにある,「array[0..9,0..2]」は二次元の集合数を表します。
「boolean」は論理値であり,戻り値は「true」と「false」のどちらかです。ここでは,ブロックがあるときを「true」。消されたときを「false」にします。
ブロックを表示させるプログラム
procedure TForm1.makeBlock;
var
i,j:integer; //iとjを整数型の変数として宣言する
begin
//変数blockをtrueにする
for i:=0 to 2 do begin
for j:=0 to 9 do begin
block[j,i]:=true;
end;
end;
//ブロックを書き込む
with image1.Canvas do begin
for i:=0 to 2 do begin
brush.Color:=clyellow;
for j:=0 to 9 do begin
fillrect(rect((image1.Width div 10)*j,20+20*i,
(image1.Width div 10)*(j+1)-1,30+20*i));
end;
end;
end;
end;
上記を実行させると,ブロックを表示させることができます。
この「makeblock」をブロックを表示させたいところに記述するだけです。
まずは,FormCreateイベントハンドラに書き込んでみます。
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.ClientWidth:=400;
form1.ClientHeight:=500;
image1.Left:=0;
image1.Top:=0;
image1.Width:=form1.ClientWidth;
image1.Height:=form1.ClientHeight;
rakx:=200;
raky:=450;
rakw:=40;
with image1.Canvas do
begin
brush.Color:=clblack;
fillrect(image1.Canvas.ClipRect);
//ラケットを描く
brush.Color:=clwhite;
fillrect(rect(rakx,raky,rakx+rakw,raky+10));
end;
makeblock; //ここに書き込む
end;
これを実行すると,下のような画面が現れます。

これは当然ですが,ただ表示してあるだけなので実際にボールを動かしてみると,下のようになってしまいます。

次回は,ボールでブロックを消すことができるようにしてみます。