SHOEISHA iD

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

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

EDN CodeZine出張所(AD)

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

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

ボールを動かすコード

タイマーを使いボールを動かす

 ボールは、Timerコンポーネントを用いて一定間隔で移動させます。ツールパレットの「System」カテゴリから、TTimerコンポーネントをフォーム上に配置します。

Timer1のプロパティ
プロパティ
Enabled False
Interval 10

 TTimerは、Intervalプロパティで指定した間隔(ミリ秒)で、OnTimerイベントを呼び出します。ここにボールを移動させるコードを記述します。

//Timer1のイベントハンドラ
void __fastcall TGameForm::Timer1Timer(TObject *Sender)
{
    MoveBall();
}

//ボールを移動する関数コール
void __fastcall TGameForm::MoveBall()
{
    // 移動後のボールの位置を計算します
    int x = Ball->Position->X + FDeltaX;
    int y = Ball->Position->Y + FDeltaY;

    TPosition *pos = Racket->Position; // ラケットの座標
    auto f1 = [this](const int inp, const int in_ang, String mp3name)->int
    {
        auto beep = beep_start(mp3name);
        FAng = in_ang - FAng;   // 跳ね返った角度を計算
        CalcNewDelta();         // 新しい移動量を計算
        if (beep != nullptr) {
            beep->Play();
        }
        if (inp < 0){ return 0; };
        return inp;
    };

   // ラケットにヒットしたかどうかを判定
    if (CheckHit(Ball->Position->X, Ball->Position->Y, x, y, pos)) {
        if (x < pos->X + 2 || x + Ball->Width > pos->X + Ball->Width - 2)
        {
            f1(0, 360, racket_mp3);
            FAng += (Random(60) - 30);  // 角で引っかけた
        }
        else
            f1(0, 360, racket_mp3);
        ++Score;
        Ball->Position->X = x;
        Ball->Position->Y = y;
        return;
    }
    //壁に当たったかの判定
    if (y + Ball->Height >= Court->Height)
    {
        // 下の壁
        Timer1->Enabled = false;
        LostRacket(     // ラケットを消す
        [this]()
        {
            RacketCount--;  // = RacketCount - 1;
            if (RacketCount == 0)
            {
                GameOver();  // ゲームオーバー
            }
            else
            {
                // 次のラケットを使ったゲームの準備
                FSpeed += 0.4;
                Ball->Position->X = Court->Width / 2;
                Ball->Position->Y = Court->Height / 3;
                FAng = Random(45) + 90;
                CalcNewDelta();
                Timer1->Enabled = true;
            }
        });
        return;
    }
    else if (y < 0)
    {
        // 上の壁
        FSpeed += 0.1;      // 上の壁に当たると少し早くなります
        y = f1(y, 360, wall_mp3);
    }


    if (x + Ball->Width >= Court->Width)
    {
        // 右の壁
        x = f1(Court->Width - Ball->Width, 182, wall_mp3);
    }
    else if (x < 0)
    {
        // 左の壁
        x = f1(x, 182, wall_mp3);
    }

    // ボールの位置を変更
    Ball->Position->X = x;
    Ball->Position->Y = y;
}

次のページ
配置と実行

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング