【Delphi / C++Builder Starter チュートリアルシリーズ】 第7回 ‟シューティングゲーム キャラクターを貼り付けよう そして動かそう„ [JAPAN]

Posted by on in Programming

【Delphi / C++Builder Starter チュートリアルシリーズ】


第7回 ‟シューティングゲーム キャラクターを貼り付けよう そして動かそう

10月24日より始まりました 「Delphi / C++Builder Starter チュートリアルシリーズ」。全10回、12月26日まで、毎週17時より30分間で、無料でダウンロード&利用できる開発環境のDelphi / C++Builder Starter エディションを使用して、ゲームを作るまで一通り、セミナーを実施してまいります。

 

なお、前回および初回分の内容に関するブログ記事は以下のリンクからお読み頂けます。

<< 第6回 ‟ミニゲームを作ってみよう„ 

<< 第1回 ‟無料で始めよう アプリ作成„ 

 


 [アジェンダ]

  • アニメーションイベントを使う
  • TRectangleを使う
  • 描画順番を知る

 

[開発環境インストール]

[Delphi / C++Builder Starter チュートリアルシリーズ]  第1回 ‟無料で始めよう アプリ作成„をご参考になり、開発環境をインストールしてください。 

[今回の仕様]


  1. 背景横スクロール
  2. 戦闘機は上下移動
  3. ミサイル発射

全ての動きはTFloatAnimationを使います

[シューティングゲーム用ドット絵フリー素材] 

http://mfstg.web.fc2.com/material/index.html 
上記サイトの画像を使わせて頂きました。(ありがとうございます)

[画面構成]

  • TButton 4つ (プレーヤー操作用)
  • TRectangle 

 

TRectangleを画像を貼り付けながら配置していきます

上記例は背景(宇宙)の画像です。
プレーヤー戦闘機とミサイルも同じ方法で画像を貼り付けていきます。

各TRectangleのサイズと設定

Rectangle_background1

  • Size.Width = 1280
  • Size.Height = 480

Rectangle_background2

  • Position.X = 640
  • Size.Width = 1280
  • Size.Height = 480

Rectangle_player

  • Position.X = 100
  • Position.Y = 200
  • Size.Width = 110
  • Size.Height = 55

Rectangle_missile

  • Position.X = 296
  • Position.Y = 216
  • Size.Width = 179
  • Size.Height = 33

[背景(宇宙)アニメーションで横スクロール]


TRectangleプロパティのPosition.Xでドロップダウンリストが出ます

「TFloatAnimationの新規作成 」を選択すると 

上のようにTRectangleの下にぶら下がってる感じになり

 

TFloatAnimationのPropertyNameが設定されてる事が確認できていると思います

背景1, 背景2, プレーヤー戦闘機、ミサイル 全てに同じようにTFloatAnimationを作っていきます
(戦闘機はPosition.X, Position.Y両方にTFloatAnimationを作ります)

 

[FloatAnimation_background1,2 OnFinishイベント追加]

 

オブジェクトインスペクタからTFloatAnimationイベントを選択しOnFinishの部分にマウスでダブルクリックしますと
イベントハンドラ画面が出てまいります。そこにコードを埋めます

背景1のDelphiコード

////
procedure TfmShooting_main.FloatAnimation_background1Finish(Sender: TObject);
begin
  case Round(Rectangle_background1.Position.X) of
    0: begin
      FloatAnimation_background1.StartValue := 0;
      FloatAnimation_background1.StopValue  := -Self.Width;
    end;
    else
    begin
      FloatAnimation_background1.StartValue := Self.Width;
      FloatAnimation_background1.StopValue  := 0;
    end;
  end;
  FloatAnimation_background1.Start;
end;

背景1のC++コード

////
void __fastcall TfmShooting_main::FloatAnimation_background1Finish(TObject *Sender)

{
	int x_{(int)System::Math::RoundTo(Rectangle_background1->Position->X, 0)};
	switch (x_){
	case 0:
		FloatAnimation_background1->StartValue = 0;
		FloatAnimation_background1->StopValue  = -this->Width;
		break;
	default:
		FloatAnimation_background1->StartValue = this->Width;
		FloatAnimation_background1->StopValue  = 0;
		;
	}
	FloatAnimation_background1->Start();
}

 

背景2のコード

////
procedure TfmShooting_main.FloatAnimation_background2Finish(Sender: TObject);
begin
  case Round(Rectangle_background2.Position.X) of
    0: begin
      FloatAnimation_background2.StartValue := 0;
      FloatAnimation_background2.StopValue  := -Self.Width;
    end;
    else
    begin
      FloatAnimation_background2.StartValue := Self.Width;
      FloatAnimation_background2.StopValue  := 0;
    end;
  end;
  FloatAnimation_background2.Start;
end;

背景2のC++コード

////
void __fastcall TfmShooting_main::FloatAnimation_background2Finish(TObject *Sender)

{
	int x_{(int)System::Math::RoundTo(Rectangle_background2->Position->X, 0)};
	switch (x_){
	case 0:
		FloatAnimation_background2->StartValue = 0;
		FloatAnimation_background2->StopValue  = -this->Width;
		break;
	default:
		FloatAnimation_background2->StartValue = this->Width;
		FloatAnimation_background2->StopValue  = 0;
		;
	}
	FloatAnimation_background2->Start();
}

[Player 戦闘機操作用 ボタン]

Upボタン

  • Anchors = [akLeft, akBottom]
  • Position.X = 5
  • Position.Y = 344
  • Size.Width = 80
  • Size.Height = 50
  • Text = '▲'

Downボタン

  • Anchors = [akLeft, akBottom]
  • Position.X = 5
  • Position.Y = 408
  • Size.Width = 80
  • Size.Height = 50
  • Text = '▼'

ミサイルボタン

  • Anchors = [akRight, akBottom]
  • Position.X = 552
  • Position.Y = 400
  • Size.Width = 80
  • Size.Height = 50
  • Text = '■'

 

[戦闘機TFloatAnimation Position.Y側 に コードを追加]

Delphi

////
procedure TfmShooting_main.FloatAnimation_player_xFinish(Sender: TObject);
begin
  Button_missile.Visible  := True;
  Button_up.Visible       := True;
  Button_down.Visible     := True;
end;

C++

[ミサイルTFloatAnimation Position.Y側 に コードを追加]

Delphi

////
procedure TfmShooting_main.FloatAnimation_missileFinish(Sender: TObject);
begin
  Button_missile.Enabled    := True;
  Rectangle_missile.Visible := False;
end;

 

[プレーヤ戦闘機操作ボタンイベント]

Upボタン

Delphi

////
procedure TfmShooting_main.Button_upClick(Sender: TObject);
begin
  FloatAnimation_player_y.StartValue  := Rectangle_player.Position.Y;
  if Rectangle_player.Position.Y - 50 > 0 then
  begin
    FloatAnimation_player_y.StopValue   := Rectangle_player.Position.Y - 50;
  end
  else
  begin
    FloatAnimation_player_y.StopValue   := 0;
  end;

  FloatAnimation_player_y.Start;
end;

C++

////
void __fastcall TfmShooting_main::Button_upClick(TObject *Sender)
{
	FloatAnimation_player_y->StartValue = Rectangle_player->Position->Y;
	if ( Rectangle_player->Position->Y - 50 > 0){
		FloatAnimation_player_y->StopValue = Rectangle_player->Position->Y - 50;
	}
	else
	{
		FloatAnimation_player_y->StopValue = 0;
	}
	FloatAnimation_player_y->Start();
}

 

Downボタン

Delphi

////
procedure TfmShooting_main.Button_downClick(Sender: TObject);
begin
  FloatAnimation_player_y.StartValue  := Rectangle_player.Position.Y;
  if Rectangle_player.Position.Y +50 < (Self.Height- Rectangle_player.Height -50) then
  begin
    FloatAnimation_player_y.StopValue   := Rectangle_player.Position.Y + 50;
  end
  else
  begin
    FloatAnimation_player_y.StopValue   := Self.Height- Rectangle_player.Height -50;
  end;

  FloatAnimation_player_y.Start;
end;

C++

////
void __fastcall TfmShooting_main::Button_downClick(TObject *Sender)
{
	FloatAnimation_player_y->StartValue	= Rectangle_player->Position->Y;
	if ((Rectangle_player->Position->Y +50) < (this->Height- Rectangle_player->Height -50)){
		FloatAnimation_player_y->StopValue = Rectangle_player->Position->Y + 50;
	}
	else{
		FloatAnimation_player_y->StopValue = this->Height- Rectangle_player->Height -50;
	}
  FloatAnimation_player_y->Start();

}

 

ミサイルボタン

Delphi

  /http://mfstg.web.fc2.com/material/index.html
procedure TfmShooting_main.Button_missileClick(Sender: TObject);
begin
  Button_missile.Enabled            := False;
  FloatAnimation_missile.StartValue := Rectangle_player.Position.X + 20;
  Rectangle_missile.Position.Y      := Rectangle_player.Position.Y + 25;
  Rectangle_missile.Visible := True;
  FloatAnimation_missile.Start;
end;

C++

////
void __fastcall TfmShooting_main::Button_missileClick(TObject *Sender)
{
	Button_missile->Enabled				= false;
	FloatAnimation_missile->StartValue 	= Rectangle_player->Position->X + 20;
	Rectangle_missile->Position->Y     	= Rectangle_player->Position->Y + 25;
	Rectangle_missile->Visible 			= true;
	FloatAnimation_missile->Start();
}

 

 

[スタート画面]

 

 

[スタートボタンイベントを作る]

Delphi

 

////
procedure TfmShooting_main.Button_startClick(Sender: TObject);
begin
  Rectangle_player.Visible      := True;
  Rectangle_startscene.Visible  := False;
  FloatAnimation_player_x.Start;
end;

C++

 

void __fastcall TfmShooting_main::Button_startClick(TObject *Sender)
{
  Rectangle_player->Visible      	= true;
  Rectangle_startscene->Visible		= false;
  FloatAnimation_player_x->Start();
}

 

[プレーヤー戦闘機 登場アニメーション]

これも同じくOnFinishイベントにコードを追加します

Delphi

////
procedure TfmShooting_main.FloatAnimation_player_xFinish(Sender: TObject);
begin
  Button_missile.Visible  := True;
  Button_up.Visible       := True;
  Button_down.Visible     := True;
end;

 

C++

///
void __fastcall TfmShooting_main::FloatAnimation_player_xFinish(TObject *Sender)
{
	Button_missile->Visible	= true;
	Button_up->Visible		= true;
	Button_down->Visible	= true;
}


[githubにソースを公開しております]

https://github.com/mojeld/embarcadero_jp_shooting_game

 

■次回は12月12日(月)17:00より  “シューティングゲーム 敵を動かしてみよう„ をお送りします。

 

 

<< 第6回 ‟ミニゲームを作ってみよう„ 

>> 第8回 ‟シューティングゲーム 敵を動かしてみよう„



About
Gold User, No rank,
Delphi / C++Builder blogger

Comments

Check out more tips and tricks in this development video: