ゲームのコードを記述するための準備
ラケットを操作するためのボタン
スマートフォンアプリ版では、ラケットを操作するためのボタンを画面下の左右に配置し、画面をタップしてラケットを動かせるようにします。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); } } }