10-1 ボスインベーダーを作ろう

敵が1種類しか出てこないシューティングゲームはあまり面白くないので、インベーダーのボスを作りましょう。ボスは、他のインベーダーとは違う動きをすることにし、そのために「乱数移動」というボタンを配置することにします。出来上がるフォームは

実行中の画面

のようになります。

【練習問題】

「ファイル」→「新規作成」→「フォーム」で上のフォームを作りましょう。コンポーネントを配置し終わったら、「ファイル」→「名前を付けて保存」で「invader_boss」という名前で保存します。

ボスインベーダーフォームの Visible プロパティを True にしておきましょう。また、「乱数移動」ボタン以外のボタンのイベントハンドラを、(第9章で作成した) 普通のインベーダーの時と同様に書き込みましょう (ここまでできたプログラムを下からダウンロードすることができます)。

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

「乱数移動」ボタンのイベントハンドラは、ボスインベーダーとして不規則な動きをするように、次のようにします。

// 「乱数移動」ボタン
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機のインベーダーが動くようになりました。動作を確認してみましょう。動きから、どれがボスインベーダーであるか分かりますか?