Vector C++;游戏-我应该多次初始化游戏状态吗?

Vector C++;游戏-我应该多次初始化游戏状态吗?,vector,initialization,sdl,states,Vector,Initialization,Sdl,States,我有一个赤裸裸的游戏状态系统,但我需要一些关于如何改进它的建议。我有一个游戏状态,所有游戏状态都是从它继承来的。因此,为了管理游戏状态,我有一个存储游戏状态向量的类 std::vector<GameState *> gameStates; .cpp 然后像这样初始化它们: mainMenu->initialize(this, camera); inGame->initialize(this, camera); 然后将它们添加到向量中,如下所示: setCurrentG

我有一个赤裸裸的游戏状态系统,但我需要一些关于如何改进它的建议。我有一个游戏状态,所有游戏状态都是从它继承来的。因此,为了管理游戏状态,我有一个存储游戏状态向量的类

std::vector<GameState *> gameStates;
.cpp

然后像这样初始化它们:

mainMenu->initialize(this, camera);
inGame->initialize(this, camera);
然后将它们添加到向量中,如下所示:

setCurrentGameState(mainMenu);
setCurrentGameState(new MainMenuState(this, camera));
我应该像已经在做一样做还是像这样做:

setCurrentGameState(mainMenu);
setCurrentGameState(new MainMenuState(this, camera));

我应该在游戏开始时初始化所有游戏状态,还是应该在它们被推入向量时初始化它们,然后在它们弹出时再次删除它们?在过去,我曾尝试在推送它们时初始化它们,但这会使处理内存变得更加困难。但是,在游戏开始时初始化所有游戏状态会影响性能吗

根据我的经验,我可以说:这取决于你的比赛有多大

一点建议。您可以在多个FSM中拆分游戏。一个用于主菜单/选项/积分部分,另一个用于“真实”游戏部分。通过这种方式,您可以实例化当前正在使用的FSM的所有状态,并调用相关方法来激活它们

一个小小的架构示例:

class State
{
public:
   virtual void OnEnter() = 0;
   virtual void OnUpdate(float i_fTime) = 0;
   virtual void OnExit() = 0;
};

class FSM
{
public:
     /*
       here you call onenter for the state where you want 
       to go and onexit for the current state
     */
     virtual void GoToState( const std::string& state_name ) = 0;

     /*
       here you call OnUpdate method on m_pCurrentState
     */
     virtual void Update( float i_fTime ) = 0;

private:
     State* m_pCurrentState;
     std::map<std::string, State*> m_mStates;
};

class FSMSystem
{
public:
     void SetCurrentFSM( FSM* i_pFSM );
     void Update( float i_fTime );

private:
     FSM* m_pCurrentFSM;
};
类状态
{
公众:
虚拟void OnEnter()=0;
虚拟void OnUpdate(float i_fTime)=0;
虚拟void OnExit()=0;
};
类有限状态机
{
公众:
/*
在这里,您可以为您想要的州调用OneNet
在当前状态下退出和退出
*/
虚拟void gostate(const std::string&state_name)=0;
/*
这里调用m_pccurrentstate上的OnUpdate方法
*/
虚拟无效更新(浮动i_fTime)=0;
私人:
状态*m_p当前状态;
标准::地图m_m状态;
};
类FSM系统
{
公众:
无效设置当前FSM(FSM*i_pFSM);
无效更新(浮动i_fTime);
私人:
FSM*m_p当前FSM;
};
对于每个自定义fsm,必须从fsm接口实现。对于每个自定义状态,必须实现state类


在创建FSM期间,在构造函数(或init方法)内初始化状态。将繁重的内容(如纹理加载/复杂算法或类似的请求)留给Onener方法。

配置文件,看看两个邪恶中的哪一个更适合你。我根本不会使用原始指针。改为坚持使用
std::shared_ptr
std::unique_ptr
。和友好的建议;不要做一般的游戏引擎。让它们正常工作需要很多时间。除非你和其他人一起工作,否则最好专注于单个游戏。谢谢olevegard,使用std::Shared_ptr或std::uniquire_ptr有什么优势?我应该在哪里使用它们?