アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在C/C++でゲーム制作をしているのですが、
Scene管理について悩んでいます。

現状での試作のScene管理クラスが、

CSceneManager.h
//==============================================
// シーンを管理しているクラス
//==============================================
class CSceneManager
{
private:
   //==============================================
   // シングルトンのためprivateにコントラスタ・デストラクタ記述
   //==============================================
   CSceneManager() {}
   ~CSceneManager() {
      m_NowScnene = nullptr;
   }
   //==============================================
   // コピー禁止
   //==============================================
   CSceneManager(const CSceneManager&) = delete;
   CSceneManager& operator=(const CSceneManager&) = delete;
   CSceneManager(CSceneManager&&) = delete;
   CSceneManager& operator=(CSceneManager&&) = delete;

   enum class eScene
   {
      Title  = 0,
      Game = 1
   };
public:
   //==============================================
   // 自身のインスタンス
   //==============================================
   static CSceneManager& GetInstance()
   {
      static CSceneManager l_Instance;
      return l_Instance;
   }
   //==============================================
   // 初期化
   //==============================================
   void Init();
   //==============================================
   // 初期化
   //==============================================
   void Update();
   //==============================================
   // 初期化
   //==============================================
   void Draw();
   //==============================================
   // Scene切り替え
   //==============================================
   void ChangeScene(const eScene _ChangeScene);
private:
   shared_ptr<IBaseScene> m_NowScnene;
};

// 他で使いやすくするためにマクロ化
#define SCENE_MGR CSceneManager::GetInstance()

CSceneManager.cpp
//==============================================
// シーンの初期化を行う
//==============================================
void CSceneManager::Init()
{
   m_NowScnene = make_shared<CTitleScene>();
   m_NowScnene->Init();
}
//==============================================
// シーンの更新処理を行う
//==============================================
void CSceneManager::Update()
{
   if (!m_NowScnene) return;
   m_NowScnene->Update();
}
//==============================================
// シーンの更新処理を行う
//==============================================
void CSceneManager::Draw()
{
   if (!m_NowScnene) return;
   m_NowScnene->Draw();
}
//==============================================
// Scene切り替え
//==============================================
void CSceneManager::ChangeScene(const eScene _ChangeScene)
{
   m_NowScnene = nullptr;
   switch (_ChangeScene)
{
   case eScene::Title:
      m_NowScnene = make_shared<CTitleScene>();
      break;
   case eScene::Game:
      m_NowScnene = make_shared<CGameScene>();
      break;
   default:
      assert(false && "存在しないシーンを呼ぼうとしています。");
      break;
   }
   m_NowScnene->Init();
}

になっています。(見づらかったらすみません...)

フェードインフェードアウトは現状作っていません。

問題として、Sceneが増えて来たらenumとswitch文の中身が増えるって言うのと、
ゲームで良くあるタイトルからロード挟まずに、直ぐにセレクトシーンに移動する行為ができないこと、
Sceneの中身を全て切り替えているので、前のSceneの情報を何かしらに保存しなくてはいけないところでしょうか?

もっと効率良くしたいので、ご指摘いただけると幸いです。
なんだったら処理を全部変える勢いなので、皆様のやりかたが聞きたいです!!

質問者からの補足コメント

  • 補足としてIBaseSceneは、
    インターフェースでInit,Update,Drawが入っています。

    それを継承してSceneクラスを作っています。

      補足日時:2019/03/13 18:42

A 回答 (1件)

「ゲームで良くあるタイトルからロード挟まずに、直ぐにセレクトシーンに移動する行為ができない」はなにをいっているのか (このプログラムとどのように関連するのか) わからないのでパス. あと「Sceneの中身を全て切り替えているので、前のSceneの情報を何かしらに保存しなくてはいけない」については「前のSceneの情報」を記憶しておくべき理由がわからんのでこれも無視.



で残った部分だけど, 「Scene」を列挙子で定義するなら, 少なくとも「enum の中身が増える」のはどうにもならんと思うよ. switch については, 現状の形 (単に変数を設定して終わり) なら std::map でごまかすことも可能だけど, どっちがうれしいかといわれると困る. あるいはマクロを駆使すれば「本当は『中身が増える』んだけど見た目は増えてない」ようにすることもできる (けど見やすいかどうかは属人的な評価項目であると思われる).

それから, これは前にも 1回書いたんだけど, 変数名について
void ChangeScene(const eScene _ChangeScene);
は危険だからね.
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!