敵が1種類しか出てこないシューティングゲームはあまり面白くないので、インベーダーのボスを作りましょう。ボスは、他のインベーダーとは違う動きをすることにし、そのために「乱数移動」というボタンを配置することにします。出来上がるフォームは
のようになります。
「ファイル」→「新規作成」→「フォーム」で上のフォームを作りましょう。コンポーネントを配置し終わったら、「ファイル」→「名前を付けて保存」で「invader_boss」という名前で保存します。
ボスインベーダーフォームの Visible プロパティを True にしておきましょう。また、「乱数移動」ボタン以外のボタンのイベントハンドラを、(第9章で作成した) 普通のインベーダーの時と同様に書き込みましょう (ここまでできたプログラムを下からダウンロードすることができます)。
「乱数移動」ボタンのイベントハンドラは、ボスインベーダーとして不規則な動きをするように、次のようにします。
// 「乱数移動」ボタン procedure TFormInvaderBoss.ButtonRandomMoveClick(Sender: TObject); begin SpinEditSpeed.Value := SpinEditSpeed.Value + Random(7) - 3; ButtonMoveClick(Sender); end;
最後に、次のように control ユニットに変更を加え、
unit control; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TFormControl = class(TForm) ButtonStart: TButton; ButtonFire: TButton; TimerMain: TTimer; procedure TimerMainTimer(Sender: TObject); procedure ButtonStartClick(Sender: TObject); procedure ButtonFireClick(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var FormControl: TFormControl; implementation uses invader, bullet, invader_boss; {$R *.DFM} // タイマーが時間を刻むごとに procedure TFormControl.TimerMainTimer(Sender: TObject); begin FormInvader1.ButtonMoveClick(Sender); // インベーダー1を動かす FormInvader2.ButtonMoveClick(Sender); // インベーダー2を動かす FormInvader3.ButtonMoveClick(Sender); // インベーダー3を動かす FormInvader4.ButtonMoveClick(Sender); // インベーダー4を動かす FormInvaderBoss.ButtonRandomMoveClick(Sender); // ボスインベーダーを動かす FormBullet.ButtonMoveClick(Sender); // 弾を動かす end; // 「開始」ボタン procedure TFormControl.ButtonStartClick(Sender: TObject); begin Randomize; // 乱数の初期化 FormInvader1.ButtonConstClick(Sender); // インベーダー1を出現させる FormInvader2.ButtonConstClick(Sender); // インベーダー2を出現させる FormInvader3.ButtonConstClick(Sender); // インベーダー3を出現させる FormInvader4.ButtonConstClick(Sender); // インベーダー4を出現させる FormInvaderBoss.ButtonConstClick(Sender); // ボスインベーダーを出現させる TimerMain.Enabled := True; // タイマー開始 end; // 「弾発射」ボタン procedure TFormControl.ButtonFireClick(Sender: TObject); begin FormBullet.ButtonConstClick(Sender); // 弾フォームの「初期処理」ボタンを押す end; end.
とりあえず、これでボスも含めて5機のインベーダーが動くようになりました。動作を確認してみましょう。動きから、どれがボスインベーダーであるか分かりますか?