【C++】ゲームでの画面遷移の効率の良い方法が知りたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aridai1221
記事: 16
登録日時: 8年前

【C++】ゲームでの画面遷移の効率の良い方法が知りたい

#1

投稿記事 by aridai1221 » 8年前

C++で以下のようなことを実装したいと思っています。

コード:

class Game
{

}

class SceneBase
{
public:
  virtual void init() = 0;
  virtual void main() = 0;
}

class Scene1 : public SceneBase
{
public:
  void init() override;
  void main() override;
}

class Scene2 : public SceneBase
{
public:
  void init() override;
  void main() override;
}

class Scene3 : public SceneBase
{
public:
  void init() override;
  void main() override;
}
こんな感じのクラスがあり、
SceneBaseという基本クラスの型にした配列を作り、
配列要素にScene1からScene3のインスタンスを
アップキャストして入れたい。

その配列の添え字を変えることで
場面を切り替えることをしたい。

その配列はGameクラスのメンバに持たせたい。


と言った感じです。
C++の経験は1ヶ月も満たない初心者ですが、
C#なら少しだけわかります。

コード:

using System;

class Program
{
    //  配列にアップキャストして入れる
    static SceneBase[] scenes = {
        new Title(),
        new Battle(),
        new Ending()
        };

    public static void Main()
    {
        //  iの値を変えるだけで場面の分岐ができる
        int i;
        for (i = 0; i < 3; i++)
            scenes[i].main();
    }
}

/* 抽象クラス */
abstract class SceneBase
{
    //  派生クラスで実装させる
    public abstract void main();
}

/* タイトル場面 */
class Title : SceneBase
{
    public override void main()
    {
        Console.WriteLine("タイトル場面");
    }
}

/* バトル場面 */
class Battle : SceneBase
{
    public override void main()
    {
        Console.WriteLine("バトル場面");
    }
}

/* エンディング場面 */
class Ending : SceneBase
{
    public override void main()
    {
        Console.WriteLine("エンディング場面");
    }
}
これのようなことをC++でやりたいのですが、
どのようにすればいいのかが分かりません。
コードをいただけないでしょうか。
最後に編集したユーザー aridai1221 on 2016年1月31日(日) 11:07 [ 編集 1 回目 ]

aridai1221
記事: 16
登録日時: 8年前

Re: 【C++】ゲームでの画面遷移ができない

#2

投稿記事 by aridai1221 » 8年前

分からない点というのは

コード:

class Game
{
public:
  //  SceneBaseを型にしたポインタの配列
  SceneBase* scenes[3];

  //  コンストラクタ
  Game();
}

Game::Game()
{
  //  staticだからインスタンスは保持される
  static Scene1 s1;
  static Scene2 s2;
  static Scene3 s3;

  //  インスタンスのアドレスをポインタ配列に入れる
  scenes[0] = &s1;
  scenes[1] = &s2;
  scenes[2] = &s3;
}
というようにするとできるのですが、
何かもっと効率のよい方法が無いかと思いました。

配列を宣言時に要素で初期化してしまう方法
などを考えたので
より効率のよい方法があるのではないかと思いました。
しかし、C++では実装できなかったような気がしたので分かりませんでした。

aridai1221
記事: 16
登録日時: 8年前

Re: 【C++】ゲームでの画面遷移の効率の良い方法が知りたい

#3

投稿記事 by aridai1221 » 8年前

ためしに

コード:

class Game
{
public:
  SceneBase* scenes[] = {
    new Scene1,
    new Scene2,
    new Scene3
  };
}
このようなコードを書いたのですが、
「配列のサイズが0になってしまうからダメです」
といった感じのエラーが出ました。
ますますわからなくなりました。

aridai1221
記事: 16
登録日時: 8年前

Re: 【C++】ゲームでの画面遷移の効率の良い方法が知りたい

#4

投稿記事 by aridai1221 » 8年前

もしくは私の設計が根本的に良くないというか
悪い設計というのであれば
より良い設計を教えて下さい。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 【C++】ゲームでの画面遷移の効率の良い方法が知りたい

#5

投稿記事 by ISLe » 8年前

aridai1221 さんが書きました:もしくは私の設計が根本的に良くないというか
悪い設計というのであれば
より良い設計を教えて下さい。
提示されたコードだとGameがSceneBaseの派生をすべて知っていないといけないわけで、
それだと
シーンが増えたり減ったりとかシーンの変更があったりするたびに
フルビルド(に近いこと)が起こって効率が悪いと思います。

SceneBaseの派生が、次のシーンがあればそれを生成して返すような仕組みにすれば
GameはSceneBaseの派生まで知らなくて済みます。
シーンは、シーンごとに独立して、関連のあるシーンの影響しか受けなくなります。

► スポイラーを表示

aridai1221
記事: 16
登録日時: 8年前

Re: 【C++】ゲームでの画面遷移の効率の良い方法が知りたい

#6

投稿記事 by aridai1221 » 8年前

返信ありがとうございます。

たしかにGameが全部のSceneBaseの派生クラスが書かれている
ヘッダをインクルードしていますし、そうかもしれません。

あと、コードありがとうございます。
C++ではstaticメンバ変数はグルーバル領域で
実体を作らなくてはならないということを忘れていました。

参考にさせていただきます。

閉鎖

“C言語何でも質問掲示板” へ戻る