−トップへ−

ブロックくずしゲームを作る
その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の数字を変更することで,変えることができます。  
 次回は,ボールを打ち返すラケットを作ってみたいと思います。

−トップへ−