SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

EDN CodeZine出張所(AD)

C++Builder 10.2 TokyoでレトロなラケットゲームをiOSで再構築してみる

  • X ポスト
  • このエントリーをはてなブックマークに追加

ゲームのコードを記述するための準備

ラケットを操作するためのボタン

 スマートフォンアプリ版では、ラケットを操作するためのボタンを画面下の左右に配置し、画面をタップしてラケットを動かせるようにします。Court上にTLayoutを配置しTSpeedButtonを2つ右側と左側に配置します。

 さらに、Racket(TLabel)をなめらかに動かすためにRacket上にTFloatAnimationを配置します。

FloatAnimation1のプロパティ
プロパティ
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);
        }
    }
}

次のページ
ゲームのコードを記述する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
EDN CodeZine出張所連載記事一覧

もっと読む

この記事の著者

EDN編集部(イーディーエヌ編集部)

エンバカデロ・デベロッパーネットワーク(EDN)は、ソフトウェア開発者とデータベース技術者のための技術情報サイトです。Delphi、C++Builderをはじめとする開発ツールやER/Studioなどのデータベースツールに関連する技術記事、ビデオなどを提供しています。EDN編集部は、EDN記事と連携...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10589 2017/12/21 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング