シーンの管理方法で悩んでいます
Posted: 2016年9月20日(火) 02:33
いつもこちらのサイトでお世話になっております。PKと申します。
現在ゲームを作成しようとしています。
以下のようにして、シーンごとに CSceneMgr を作成してシーン管理を行おうとしていますが、
ISceneChanger.h 内の virtual enum EScene = 0 や
CSceneMgr.h 内の void ChangeScene(enum EScene NextScene) override でエラーになります。
virtual は関数にしか使えないのは分かりますが、このようにシーケンス(シーンの上の区別)ごとに、その中のシーンは違うので、それをシーンごとに namespace 等でスコープを分けて、enum 定数で管理し、ChangeScene 関数にそれを渡せるようにするべきだと思うのですが、このような方法以外に何か良い方法はありますか。
または、同様の方法でこのエラーを回避できる方法があれば教えてください。
質問内容が分かりにくければ、返信します。よろしくお願いします。
CBaseScene.h
CSceneTask.h
ISceneChanger.h
CSceneMgr.h
現在ゲームを作成しようとしています。
以下のようにして、シーンごとに CSceneMgr を作成してシーン管理を行おうとしていますが、
ISceneChanger.h 内の virtual enum EScene = 0 や
CSceneMgr.h 内の void ChangeScene(enum EScene NextScene) override でエラーになります。
virtual は関数にしか使えないのは分かりますが、このようにシーケンス(シーンの上の区別)ごとに、その中のシーンは違うので、それをシーンごとに namespace 等でスコープを分けて、enum 定数で管理し、ChangeScene 関数にそれを渡せるようにするべきだと思うのですが、このような方法以外に何か良い方法はありますか。
または、同様の方法でこのエラーを回避できる方法があれば教えてください。
質問内容が分かりにくければ、返信します。よろしくお願いします。
CBaseScene.h
#ifndef _INCLUDE_GUARD_CBASESCENE_
#define _INCLUDE_GUARD_CBASESCENE_
#include "CSceneTask.h"
#include "ISceneChanger.h"
//シーンの基底クラス。
class CBaseScene : public CSceneTask {
protected:
ISceneChanger* mSceneChanger; //クラス所有元にシーン切り替えを伝えるインターフェイス
public:
CBaseScene(ISceneChanger* changer);
virtual ~CBaseScene() {}
virtual void Load() override {}; //ロード処理をオーバーライド。
virtual void Unload() override {}; //アンロード処理をオーバーライド。
virtual void Calc() override {}; //更新処理をオーバーライド。
virtual void Draw() override {}; //描画処理をオーバーライド。
};
#endif
#ifndef _INCLUDE_GUARD_CSCENETASK_
#define _INCLUDE_GUARD_CSCENETASK_
//共通処理のクラス
class CSceneTask {
public:
virtual ~CSceneTask() {}
virtual void Load() = 0; //ロード処理は必ず継承先で実装する
virtual void Unload() = 0; //アンロード処理は必ず継承先で実装する
virtual void Calc() = 0; //更新処理は必ず継承先で実装する
virtual void Draw() = 0; //描画処理は必ず継承先で実装する
};
#endif
#ifndef _INCLUDE_GUARD_ISCENECHANGER_
#define _INCLUDE_GUARD_ISCENECHANGER_
//シーンを変更するためのインターフェイスクラス
class ISceneChanger {
public:
virtual ~ISceneChanger() = 0;
//指定シーンに変更する。
virtual void ChangeScene(enum EScene NextScene) = 0;
protected:
virtual enum EScene = 0;
};
#endif
#ifndef _INCLUDE_GUARD_CSCENEMGR_
#define _INCLUDE_GUARD_CSCENEMGR_
#include "ISceneChanger.h"
#include "CBaseScene.h"
class CSceneMgr : public ISceneChanger, CSceneTask {
private:
CBaseScene* mScene; //シーン管理変数
EScene mNextScene; //次のシーン管理変数
enum EScene {
Scene_Load,
Scene_XXX, //このシーケンス(シーンの一つ上の区別です)特有のシーン
Scene_Unload
} override;
public:
CSceneMgr();
void Load() override; //ロード
void Unload() override; //アンロード
void Calc() override; //更新
void Draw() override; //描画
// 引数 NextScene にシーンを変更する
void ChangeScene(enum EScene NextScene) override;
};
#endif