さて、この節ではインベーダーの数を増やしましょう。と言うと、「今までと同じ事を何度もやるのか。面倒だな…」と思うかもしれません。しかし、以下に示す通り、実は驚くほど簡単にインベーダーを増やすことができるのです。さっそくその“仕掛け”をみてみましょう!
invader ユニットの中ほど、implementation という行の直前に
var
FormInvader: TFormInvader;
という記述があります。この形、どこかで見た覚えがありませんか? そう、「3-8 変数 (2) ―宣言して使う変数―」で初めて出てきた変数宣言とそっくりですね。
また、このインベーダーゲームプログラムでも変数を使っています。インベーダーを描く部分 ButtonDrawClick では次のように変数が用意されています。
変数はプログラマーが用意するものですから、変数の名前が気に入らない場合は自由に名前を変えることができますね。では、この invader ユニットの
var
FormInvader: TFormInvader;
の名前も自由に変えてしまって構わないのでしょうか? 試しにこの部分を
var FormInvader1: TFormInvader;
と変更し、実行してみましょう。
5つのエラーが発生しましたね (そのうち2つは付随的なエラーなので、本当のエラーは3つです)。全て「未定義の識別子 : 'FormInvader'」というエラー、つまり「FormInvader なんてものは存在しないよ」というエラーです。これらはすべて
FormInvader → FormInvader1
に書き換えましょう。
ところで、これらのエラーを上から順に解決していき、最後のエラーを開くと…
つまり
というエラー表示をダブルクリックすると、見たこともないファイルが開かれます。実はこのファイルは、各ユニットではなくプロジェクト「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 です。形式的には、FormInvader1 は TFormInvader 型の“変数”と捉える事ができます (CreateForm というメソッドを呼び出さなければならない点が変数と少し異なりますが、ここでは気にしないでください)。そしてこれまで学習した通り、同じ型の変数は、宣言すればいくらでも作ることができます。さっそく試してみましょう。 プログラムを次のように変更してください。
var FormInvader1: TFormInvader; FormInvader2: TFormInvader; FormInvader3: TFormInvader; FormInvader4: TFormInvader;
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.
プログラムを実行し、インベーダーフォームが4つ表示されることを確認しましょう (ただし、現時点では表示盤にはインベーダーは1機しか出現しません)。
※ インベーダーフォームが重なり合っていてプログラム起動時に1枚にしか見えないことがありますが、その場合も1枚ずつ移動させると4枚あることが分かります。
※ 9-4 のコラムで説明した通り、「インベーダー」フォームはオブジェクトです。すると、形式的には、オブジェクト「FormInvader1」、…「FormInvader4」はそれぞれ TFormInvader 型の変数と捉えることができます。