Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2017/12/21 14:00

目次

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

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

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

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

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

バックナンバー

連載:EDN CodeZine出張所

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5