ブロックくずしゲームを作る
その2 ボールを動かす
前回設定したフォームの中で,ボールを動かしてみたいと思 います。
timerコンポーネント
今回新たに,Timerコンポーネントを使います。 Timerコンポーネントはツールパレット(画面右下)の「system」のフォルダに入っていますので,それをフォームに設置してください。
Timerコンポーネントを設置したら,Timerコンポーネントを選択し,オブジェクトインスペクタ(画面左下)のプロパティでTimerコンポーネントのプロパティを変更します。(EnabledとIntervalを変更します。)

次に,イベントハンドラを2つ呼び出します。
Image1Click と Timer1Timer の2つですが,これらは,フォームに設置したImageコンポーネントとTimerコンポーネントをダブルクリックすることで,イベントハンドラを呼び出すことがでいます。
ここまでのコードを掲載します。
type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
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;
with image1.Canvas do
begin
brush.Color:=clblack;
fillrect (image1.Canvas.ClipRect);
end;
end;
//新たに次の2つのイベントハンドラが追加されました
procedure TForm1.Image1Click(Sender: TObject);
begin
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
end;
変数の宣言
これで,ボールを動かすためのプログラムを書く準備ができました。
まず最初に,ボールの座標を表すための変数を宣言します。ここでは次のようにしてみます。
ballx…ボールのX座標
bally…ボールのY座標
bx …ボールの進む距離(横方向に進 む数)
by …ボールの進む距離(縦方向に進 む数)
balls…ボールの大きさ
これらの変数の名前は適当で良いのですが,自分でわかりやすい名前を付けないと混乱してしまいます。
これらの変数をPrivate部で,整数宣言します。
type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
ballx,bally,bx,by,balls:integer; //すべての変数を整数型の変数として宣言
public
{ Public 宣言 }
end;
Image1.Clickへの書き込み
次に,Image1.Clickイベントハンドラで変数の値を入力して,Timerコンポーネントを作動させます。
コードに書くと下のようになります。
procedure TForm1.Image1Click(Sender: TObject);
begin
ballx:=200; ボールのX座標を200にする
bally:=300; ボールのY座標を300にする
bx:=3; ボールがX方向に進む距離を3にする
by:=-6; ボールがY方向に進む距離を−6にする
balls:=6; ボールの大きさを6にする
timer1.Enabled:=true; Timer1を作動させる
end;
Timerへの書き込み
次に,Timerイベントハンドラにプログラムを記述していきます。
まず,今までのボールを黒で塗りつぶします。
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;
ボールのx座標が0以下またはホームの幅以上のときは向きを変える
ballx:=ballx+bx;
ボールのX座標に進んだ距離を加える
if (bally<=0) or (bally>=image1.Height-balls) then by:=-by;
ボールのY座標が0以下またはフォームの高さ以上のときは向きを変える
bally:=bally+by;
ボールのY座標に進んだ距離を加える
最後に,ボールが進んだ新しい場所に,新たにボールを描きます。
with image1.Canvas do begin
//新たな位置にボールを描く
brush.Color:=clwhite;
ブラシの色を白にする
fillrect(rect(ballx,bally,ballx+balls,bally+balls));
ボールの矩形の部分を塗りつぶす
end;
これをまとめて書くと,下のようになります。
procedure TForm1.Timer1Timer(Sender: TObject);
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) or (bally>=image1.Height-balls) then by:=-by;
bally:=bally+by;
//新たな位置にボールを描く
with image1.Canvas do begin
brush.Color:=clwhite;
fillrect(rect(ballx,bally,ballx+balls,bally+balls));
end;
end;
まとめ
以上のことをまとめると,次のようなコードになります。
(太字の部分が,新しく書かれたプログラムです。)
type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
ballx,bally,bx,by,balls:integer;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
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;
with image1.Canvas do
begin
brush.Color:=clblack;
fillrect (image1.Canvas.ClipRect);
end;
end;
procedure TForm1.Image1Click(Sender: TObject);
begin
ballx:=200;
bally:=300;
bx:=3;
by:=-6;
balls:=6;
timer1.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
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) or (bally>=image1.Height-balls) then by:=-by;
bally:=bally+by;
//新たな位置にボールを描く
with image1.Canvas do begin
brush.Color:=clwhite;
fillrect(rect(ballx, bally,ballx+balls,bally+balls));
end;
end;
以上を書き込んだら,実行してみてください。
フォームの黒い部分をクリックすると白いボールのようなものが,動き始めると思います。
ボールの速さはTimer1.Intervalの数字を変更することで,変えることができます。
次回は,ボールを打ち返すラケットを作ってみたいと思います。