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

时间:2014-06-14 18:06:36

标签: vector initialization sdl states

我有一个简单的游戏状态系统,但我需要一些关于如何改进它的建议。我有一个GameState.h,所有游戏状态都继承自。因此,为了管理游戏状态,我有一个存储游戏状态向量的类

std::vector<GameState *> gameStates;

这会处理游戏状态,但使用pop / push(_back)等功能。

目前我正在制作我的游戏状态:

·H

GameState *mainMenu = nullptr;
GameState *inGame = nullptr;

的.cpp

mainMenu = new MainMenuState();
inGame = new InGameState();

然后像这样初始化它们:

mainMenu->initialize(this, camera);
inGame->initialize(this, camera);

然后将它们添加到矢量中:

setCurrentGameState(mainMenu);

我应该这样做,就像我已经这样做或者像这样:

setCurrentGameState(new MainMenuState(this, camera));

我应该在游戏开始时初始化所有游戏状态,还是应该在将它们推入向量时对其进行初始化,然后在弹出它们时再次删除它们?在过去,我试图在它们被推动时对它们进行初始化,但它会使处理内存变得更加困难。然而,如果初始化所有游戏状态,游戏的开始会阻碍性能?

1 个答案:

答案 0 :(得分:1)

根据我的经验,我可以说:这取决于你的游戏有多大。

一点建议。您可以在多个FSM中分割游戏。一个用于主菜单/选项/信用部分,一个用于&#34;真实&#34;游戏部分。通过这种方式,您可以实例化当前正在使用的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;
};

对于每个自定义fsm,您必须从FSM界面实现。对于每个自定义状态,您必须实现State类。

在创建FSM期间在构造函数(或init方法)中初始化状态。留下沉重的东西(如纹理加载/复杂算法或类似的请求到OnEnter方法)。