9-5 インベーダーを増やそう

さて、この節ではインベーダーの数を増やしましょう。と言うと、「今までと同じ事を何度もやるのか。面倒だな…」と思うかもしれません。しかし、以下に示す通り、実は驚くほど簡単にインベーダーを増やすことができるのです。さっそくその“仕掛け”をみてみましょう!

invader ユニットの中ほど、implementation という行の直前に

var
  FormInvader: TFormInvader;

という記述があります。この形、どこかで見た覚えがありませんか? そう、「3-8 変数 (2) ―宣言して使う変数―」で初めて出てきた変数宣言とそっくりですね。

変数宣言の例

また、このインベーダーゲームプログラムでも変数を使っています。インベーダーを描く部分 ButtonDrawClick では次のように変数が用意されています。

変数宣言の例

変数はプログラマーが用意するものですから、変数の名前が気に入らない場合は自由に名前を変えることができますね。では、この invader ユニットの

var
  FormInvader: TFormInvader;

の名前も自由に変えてしまって構わないのでしょうか? 試しにこの部分を

var
  FormInvader1: TFormInvader;

と変更し、実行してみましょう。

5つのエラーが発生しましたね (そのうち2つは付随的なエラーなので、本当のエラーは3つです)。全て「未定義の識別子 : 'FormInvader'」というエラー、つまり「FormInvader なんてものは存在しないよ」というエラーです。これらはすべて

FormInvaderFormInvader1

に書き換えましょう。

ところで、これらのエラーを上から順に解決していき、最後のエラーを開くと…
つまり

エラー表示

というエラー表示をダブルクリックすると、見たこともないファイルが開かれます。実はこのファイルは、各ユニットではなくプロジェクト「invader_game」のプロジェクトファイルです。そしてこの

エラー行

という行は、「FormInvader というフォームを作成 (create) してください」と Windows に依頼する命令です。しかし、今や FormInvaderというフォームが存在しないので (FormInvader1 という名前に変更されているので) エラーが発生したのです。ここも、次のように変更してください。

begin
  Application.Initialize;
  Application.CreateForm(TFormControl, FormControl);
  Application.CreateForm(TFormDisplay, FormDisplay);
  Application.CreateForm(TFormInvader, FormInvader1);
  Application.CreateForm(TFormBullet, FormBullet);
  Application.Run;
end.

修正し終えたら実行してみましょう。今まで通りインベーダーゲームとして遊ぶことができましたか?

どうやら、Delphi でフォームを用意するためには、変数のように

var
  FormInvader1: TFormInvader;

と宣言し、さらに Windows に対して

Application.CreateForm(TFormInvader, FormInvader1);

と依頼する、という2つの手順が必要であるようです。それでは、逆にこの2つの手順さえ踏めばどんどんフォームを作ることができるのでしょうか…?

答えは Yes です。形式的には、FormInvader1TFormInvader 型の“変数”と捉える事ができます (CreateForm というメソッドを呼び出さなければならない点が変数と少し異なりますが、ここでは気にしないでください)。そしてこれまで学習した通り、同じ型の変数は、宣言すればいくらでも作ることができます。さっそく試してみましょう。 プログラムを次のように変更してください。

●invader ユニット

var
  FormInvader1: TFormInvader;
  FormInvader2: TFormInvader;
  FormInvader3: TFormInvader;
  FormInvader4: TFormInvader;

●invader_game プロジェクト

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

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

【基礎課題 9-7】

プログラムを実行し、インベーダーフォームが4つ表示されることを確認しましょう (ただし、現時点では表示盤にはインベーダーは1機しか出現しません)。

※ インベーダーフォームが重なり合っていてプログラム起動時に1枚にしか見えないことがありますが、その場合も1枚ずつ移動させると4枚あることが分かります。

※ 9-4 のコラムで説明した通り、「インベーダー」フォームはオブジェクトです。すると、形式的には、オブジェクト「FormInvader1」、…「FormInvader4」はそれぞれ TFormInvader 型の変数と捉えることができます。