もぐら叩きを作ってみよう その6

「もぐら叩きを作ろう その6」です。今回は、スコアや時間の表示、新しいもぐらの追加をやってみます。早速新しいもぐらをイメージエディタで描いて前回のリソースファイルに追加してください。前回同様、普通の状態のもぐらと、叩かれているもぐらの両方を描いてください。

こんな感じに作りました。

名前はMog3, Mog4として下さい。 それでは、このビットマップが使えるようにするためにプログラムを追加します。

...................
  private
    { Private 宣言 }
    Mog1: TBitmap;
    Mog2: TBitmap;
    Mog3: TBitmap;
    Mog4: TBitmap;
    HoleInfo: array[0..4] of THole;
    Holes: array[0..4] of TPoint;
  public
    { Public 宣言 }
....................

  Screen.Cursors[crUp] := LoadCursor(HInstance, 'UP');
  Screen.Cursors[crDown] := LoadCursor(HInstance, 'DOWN');
  Screen.Cursor := TCursor(crUp);

  Mog1 := TBitmap.Create;
  Mog1.LoadFromResourceName(HInstance, 'MOG1');
  Mog2 := TBitmap.Create;
  Mog2.LoadFromResourceName(HInstance, 'MOG2');
  Mog3 := TBitmap.Create;
  Mog3.LoadFromResourceName(HInstance, 'MOG3');
  Mog4 := TBitmap.Create;
  Mog4.LoadFromResourceName(HInstance, 'MOG4');
......................

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Mog1.Free;
  Mog2.Free;
  Mog3.Free;
  Mog4.Free;
end;

ここまでは、大丈夫ですね。 もぐらのことはひとまずこれで置いときます。続いて、スコアの表示と時間の表示をやります。フォームにラベルを2つ貼り付けて下さい。(もぐらの出現位置と重ならないようにしてください)そのラベルのNameプロパティをそれぞれlblScore, lblGameTimeとして下さい。

  private
    { Private 宣言 }
    Mog1: TBitmap;
    Mog2: TBitmap;
    Mog3: TBitmap;
    Mog4: TBitmap;
    HoleInfo: array[0..4] of THole;
    Holes: array[0..4] of TPoint;
  public
    { Public 宣言 }
    LiveTime, DedTime, Frequence, Score, GameTime: Integer;
  end;
........................

procedure TForm1.Start1Click(Sender: TObject);
begin
  Score := 0; // スコアの初期化
  GameTime := 200; // 時間の設定
  Timer1.Enabled := True; // OnTimer始動
end;

これで、時間の設定が出来ましたので、あとは時間がきたらゲームオーバーになるようにしてやります。ここで、もう一つラベルをフォームに貼り付けて下さい。NameプロパティはlblGameOverにして下さい。(それぞれのラベルの大きさや色は、お任せします。)

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
begin
  i := Random(Frequence);

  if (i > 5) then
  begin
    if (HoleInfo[i].Existence = False) then
    begin

      HoleInfo[i].Existence := True; // もぐらの存在を設定
      HoleInfo[i].Time := LiveTime; // もぐらの表示時間を設定
      HoleInfo[i].Dead := False;    // 「もぐらはまだ叩かれていない」を設定
      Canvas.Draw(Holes[i].X, Holes[i].Y, Mog1); // 実際にもぐらを表示
    end;
  end;

  // 表示しているもぐらがいれば、そのLiveTime(表示時間)を減らす
  for i := 0 to 4 do
  begin
    if (HoleInfo[i].Existence = True) and (HoleInfo[i].Time < 0) then
      Dec(HoleInfo[i].Time); // LiveTimeを減らしています
  end;

  // 表示しているもぐらの表示時間が過ぎていないか
  // 過ぎていたら、もぐらを消す
  for i := 0 to 4 do
  begin
    if (HoleInfo[i].Time = 0) then // 表示時間が過ぎたら
    begin
      // もぐらを消します
      HoleInfo[i].Existence := False;
      Canvas.FillRect(Rect(Holes[i].X, Holes[i].Y,
        Holes[i].X+Mog2.Width, Holes[i].Y+Mog2.Height));
    end;
  end;

  lblScore.Caption := IntToStr(Score); // スコアの描画
  Dec(GameTime); // 時間を減らす
  lblGameTime.Caption := IntToStr(GameTime); // 時間の描画

  if GameTime = 0 then
  begin
    Timer1.Enabled := False;
    lblGameOver.Caption := 'Game Over';
  end;
end;
          

これで、ゲームオーバーの設定が出来ました。それでは、最後に黄色もぐらの出現設定をやります。今回は時間が100〜50の時にだけ黄色もぐらを出現させる設定でやりたいと思います。

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
begin
  i := Random(Frequence);

  if (i < 5) then
  begin
    if (HoleInfo[i].Existence = False) then
    begin
       // 黄色もぐら出現    
      if (GameTime >= 50) and (GameTime <= 100) then 
      begin
        HoleInfo[i].Existence := True;
        HoleInfo[i].Time := 3;
        HoleInfo[i].Dead := False;
        Canvas.Draw(Holes[i].X, Holes[i].Y, Mog3);
      end else
      begin
        // 普通のもぐら出現
        HoleInfo[i].Existence := True; // もぐらの存在を設定
        HoleInfo[i].Time := LiveTime; // もぐらの表示時間を設定
        HoleInfo[i].Dead := False; // 「もぐらはまだ叩かれていない」を設定
        Canvas.Draw(Holes[i].X, Holes[i].Y, Mog1); // 実際にもぐらを表示
      end;
    end;
  end;

  // 表示しているもぐらがいれば、そのLiveTime(表示時間)を減らす
  for i := 0 to 4 do
  begin
    if (HoleInfo[i].Existence = True) and (HoleInfo[i].Time > 0) then
      Dec(HoleInfo[i].Time); // LiveTimeを減らしています
  end;

これで、規定の時間になったら、黄色もぐらが出現します。では最後に叩かれた黄色もぐらの設定をやります。

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
begin
  Screen.Cursor := Tcursor(crDown);

  for i := 0 to 4 do
  begin
    if (HoleInfo[i].Dead = False) and (HoleInfo[i].Time > 0) then
      if (X > Holes[i].X) and (X < (Holes[i].X+Mog1.Width)) and
        (Y > Holes[i].Y) and (Y < (Holes[i].Y +Mog1.Height)) then
      begin
        // 黄色もぐら出現
        if (GameTime >= 50) and (GameTime <= 100) then
        begin
          HoleInfo[i].Dead := True;
          HoleInfo[i].Time := DedTime;
          Canvas.Draw(Holes[i].X, Holes[i].Y, Mog4);
          Inc(Score, 700);
        end else
        begin  // 普通のもぐら出現
          HoleInfo[i].Dead := True;    // 「もぐらが叩かれた」を設定
          HoleInfo[i].Time := DedTime; // 叩かれた絵の表示時間を設定
          Canvas.Draw(Holes[i].X, Holes[i].Y, Mog2); // 叩かれた絵の表示
          Inc(Score, 100); // 得点追加
        end;
      end;
  end;
end;

これで、完成です。今回は少し長かったですね。さそっくコンパイルして実行してみて下さい。最低限の機能しかありませんが、立派なもぐら叩きになっています。

ちゃんと遊べます。

また、見やすくするために、「Score」「Time」と表示したラベルを貼り付けました。ゲームオーバーと表示するラベルはフォームの真ん中にCaptionを空白にして貼り付けてあります。もし、ゲームオーバーのラベルがもぐらの出てくる場所と重なっていたら、オブジェクトインスペクタで、ラベルの Enable プロパティを False にして下さい。 こうしないと、ゲーム時にもぐらが叩けなくなってしまいます。(ラベルがクリックイベントを受け取ってしまうからです)

これでひとまず「もぐら叩きを作ろう」を一旦終了したいと思います。ここまで、出来ればあとは大丈夫です。いろいろ設定を変えて遊んでみて下さい。

ソースのダウンロード


up next
Last update: 2005/03/06