現在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の情報を何かしらに保存しなくてはいけないところでしょうか?
もっと効率良くしたいので、ご指摘いただけると幸いです。
なんだったら処理を全部変える勢いなので、皆様のやりかたが聞きたいです!!
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
「ゲームで良くあるタイトルからロード挟まずに、直ぐにセレクトシーンに移動する行為ができない」はなにをいっているのか (このプログラムとどのように関連するのか) わからないのでパス. あと「Sceneの中身を全て切り替えているので、前のSceneの情報を何かしらに保存しなくてはいけない」については「前のSceneの情報」を記憶しておくべき理由がわからんのでこれも無視.
で残った部分だけど, 「Scene」を列挙子で定義するなら, 少なくとも「enum の中身が増える」のはどうにもならんと思うよ. switch については, 現状の形 (単に変数を設定して終わり) なら std::map でごまかすことも可能だけど, どっちがうれしいかといわれると困る. あるいはマクロを駆使すれば「本当は『中身が増える』んだけど見た目は増えてない」ようにすることもできる (けど見やすいかどうかは属人的な評価項目であると思われる).
それから, これは前にも 1回書いたんだけど, 変数名について
void ChangeScene(const eScene _ChangeScene);
は危険だからね.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
多重定義が起きている?--lnk20...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
【gcc・cygwin】multiple defin...
-
typedef unsigned int UINT;が...
-
C++別のオブジェクトからメンバ...
-
C/C++でのScene管理について
-
マルチメディアタイマー
-
ドラッグしたときにマウスカー...
-
(void)0 はどんな意味ですか
-
関数の再帰とは??[C言語]
-
4桁7セグでダイナミック点灯
-
クラス内で、親ではない他のク...
-
Visual Studio 6.0 でSDI開発
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
static constメンバ変数(配列)...
-
ダイアログのOKボタンを押し...
-
合同式法をつかって(CPad)
-
SC_SIZEがわからない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
C++にてtemplateで受け取った任...
-
多重定義が起きている?--lnk20...
-
gcc: incompatible pointer type
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
Notepad++の関数リスト表示の変...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
ArduinoでMouse関数を使用して...
-
DLLの関数呼び出しで引数がある...
-
void*型の配列について
-
ウインドウの移動禁止
-
const_castのつかいどころを教...
-
VC++でGetKeyboardStateがうま...
-
C言語 プロトタイプ宣言
-
stddef.hって何?
おすすめ情報
補足としてIBaseSceneは、
インターフェースでInit,Update,Drawが入っています。
それを継承してSceneクラスを作っています。