9-6 すべてのインベーダーを動かそう

さて、今はまだ1機しか出現しないプログラムですが、4機すべてを出現させるには、4つのフォームの「初期処理」ボタンを押してやるといいですね。「操作盤」の「開始」ボタンのプログラムを次のように変更してください。

// 「開始」ボタン
procedure TFormControl.ButtonStartClick(Sender: TObject);
begin
  Randomize; // 乱数の初期化
  FormInvader1.ButtonConstClick(Sender); // インベーダー1を出現させる
  FormInvader2.ButtonConstClick(Sender); // インベーダー2を出現させる
  FormInvader3.ButtonConstClick(Sender); // インベーダー3を出現させる
  FormInvader4.ButtonConstClick(Sender); // インベーダー4を出現させる

  TimerMain.Enabled := True; // タイマー開始
end;

また、「初期処理」ボタンと同様に、それぞれのインベーダーフォームの「移動」ボタンをどんどん押してやる必要があります。もちろんこれは、「操作盤」(FormControl) の TimerMain の仕事です。プログラムを次のように書き換えてください

// タイマーが時間を刻むごとに
procedure TFormControl.TimerMainTimer(Sender: TObject);
begin
  FormInvader1.ButtonMoveClick(Sender); // インベーダー1を動かす
  FormInvader2.ButtonMoveClick(Sender); // インベーダー2を動かす
  FormInvader3.ButtonMoveClick(Sender); // インベーダー3を動かす
  FormInvader4.ButtonMoveClick(Sender); // インベーダー4を動かす
  FormBullet.ButtonMoveClick(Sender); // 弾を動かす
end;

以上でインベーダーゲームが完成しました。早速遊んでみましょう。

ここまでのプログラムをダウンロード(D)

コラム 同じエラーが何度も出る

このインベーダープログラムを作っている途中で新しいフォルダにユニットを保存したとき、プロジェクトファイルに同じエラーが何度も出ることがあります。その場合は、次の場所 (下線部) を削除してください。

begin
  Application.Initialize;
  Application.CreateForm(TFormControl, FormControl);
  Application.CreateForm(TFormDisplay, FormDisplay);
  Application.CreateForm(TFormInvader1, FormInvader1);
  Application.CreateForm(TFormInvader2, FormInvader2);
  Application.CreateForm(TFormInvader3, FormInvader3);
  Application.CreateForm(TFormInvader4, FormInvader4);
  Application.CreateForm(TFormBullet, FormBullet);
  Application.Run;
end.

ここまでのプログラミングは、

(1) インベーダーフォームや弾フォームなどを作る
(2) (1) のフォームを使ってインベーダー (1機だけ) や弾を動かす
(3) インベーダーを4機に増やす
(4) 4機のインベーダーを動かす

という4つの段階がありました(実際には、(1) と (2) は完全に分離している訳ではなく、(1) ある機能を作ったら (2) 試し (1) また別の機能を作ったら (2) また試す、というように (1) と (2) の段階は行ったり来たりを繰り返します。しかし、個別の機能毎に見れば (1) と (2) は別物と見ることができます)。

これらの4つの段階の中で最も大変な作業は (1) フォームを作る作業です。 ちゃんとしたフォームさえ出来てしまえば、(2)〜(4)の フォームを使う作業はあまり大変ではありません。プログラミングは、あるまとまり (この場合はフォーム) をしっかりつくることが大切なのです。

9-4のコラムで説明した通り、「インベーダー」フォーム、「弾」フォームはそれぞれ「インベーダー」オブジェクト、「弾」オブジェクトに対応します。オブジェクト指向プログラミングで最も重要なポイントは、プログラムに必要なオブジェクトを見出し、それを作成する事なのです。

ところで、実際に遊んでいるときに必要なフォームは「表示盤」と「操作盤」だけです。そこで、「インベーダー」フォームと「弾」フォームの Visible プロパティの値を False にしてからこのプログラムを実行してみましょう。当然、このようにしても以前と変わらず遊ぶことができます。

思い出してみてください。

第2章では、最初、変数の代わりにEditコンポーネントエディットコンポーネントを使って文字の入れ替えを行ったりしました。でも、

var
  temp: String;

のように書くことによってエディットコンポーネントを使わなくてすむようになりました。

また第5章では、最初、関数や手続きの代わりにButtonコンポーネントボタンコンポーネント「計算する」を使って計算を行ったりしていました。でも、自分の手で

を定義することによってボタンを使わなくてすむようになりました。

実は、「インベーダー」フォームについても同じことが言えます。フォームの上にボタンやスピンエディットを貼り付けて「インベーダー」フォームを作ってきましたが、この代わりをする「インベーダー型」のオブジェクトを自分で定義しさえすれば、フォームやボタンやスピンエディットを使う必要はないのです。それについては、第11章で学習します。

このように、自由に好きな「型」のオブジェクトを作れるようになると、オブジェクト指向プログラミングのかなりの部分をマスターしたと言えるようになります。