ゲームのコードを記述するための準備
ラケットを操作するためのボタン
スマートフォンアプリ版では、ラケットを操作するためのボタンを画面下の左右に配置し、画面をタップしてラケットを動かせるようにします。Court上にTLayoutを配置しTSpeedButtonを2つ右側と左側に配置します。
さらに、Racket(TLabel)をなめらかに動かすためにRacket上にTFloatAnimationを配置します。
| プロパティ | 値 |
|---|---|
| Name | FloatAnimation1 |
| Duration | 0.1 |
| PropertyName | Position.X |
| StartValue | 0 |
| StopValue | 0 |
| Parent | Racket |
左右に配置したTSpeedButtonの名前をLeftButton、RightButtonに変更し、イベントハンドラからRacketを左右に動かすためのコードを記述します。
void __fastcall TGameForm::LeftButtonClick(TObject *Sender)
{
//ラケットを左に移動
if (Racket->Position->X > 0)
{
FloatAnimation1->StartValue = Racket->Position->X;
FloatAnimation1->StopValue = Racket->Position->X -60;
FloatAnimation1->Start();
}
}
void __fastcall TGameForm::RightButtonClick(TObject *Sender)
{
//ラケットを右に移動
if (Racket->Position->X <= (Court->Width - Racket->Width))
{
FloatAnimation1->StartValue = Racket->Position->X;
FloatAnimation1->StopValue = Racket->Position->X +60;
FloatAnimation1->Start();
}
}
変数の用意
ボールの角度を表すFAng、移動速度を表すFSpeed、そして一回の移動量を表すFDeltaX、FDeltaYです。これらの変数は、TGameForm のメンバ変数として、Unit1.hのTGameFormクラス宣言に追加します。また、FDeltaX、FDeltaYを再計算するCalcNewDelta()とボールを移動させるためのMoveBall()関数の宣言も追加します。
private: // ユーザー宣言
int FAng, FDeltaX, FDeltaY;
double FSpeed{15};
void __fastcall MoveBall(); //ボールを動かす関数定義
void __fastcall CalcNewDelta(); //FDeltaX、FDeltaYを再計算する関数定義
プロパティの用意
スコアとラケット数管理はTGameForm上にプロパティを用意します。FScoreはスコア点数、FRacketはラケット数管理です。これもint型で用意します。
private:
int FScore, FRacket;//スコア、ラケット残数
void __fastcall SetScore(const int NewScore);
void __fastcall SetRacketCount(const int NewRacket);
public:
//スコアプロパティ
__property int Score = { read = FScore, write = SetScore };
//ラケット残数プロパティ
__property int RacketCount = { read = FRacket, write = SetRacketCount };
それぞれの関数の実態も記述します。
void __fastcall TGameForm::SetScore(const int NewScore)
{
if ((FScore = NewScore) < 0)
FScore = 0;
ScoreLabel->Text = Format(L"%0.9d", ARRAYOFCONST((FScore)) );
}
void __fastcall TGameForm::SetRacketCount(const int NewRacket)
{
if (FRacket != NewRacket)
{
(NewRacket > 5)?FRacket = 5:FRacket = NewRacket;
if (FRacket < 0) FRacket = 0;
for (int i = 0; i < 4; i++)
{
dynamic_cast(FindComponent("Racket" + IntToStr(i+1)))->Visible = (i < FRacket-1);
}
}
}

