我有一个简单的游戏状态系统,但我需要一些关于如何改进它的建议。我有一个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));
我应该在游戏开始时初始化所有游戏状态,还是应该在将它们推入向量时对其进行初始化,然后在弹出它们时再次删除它们?在过去,我试图在它们被推动时对它们进行初始化,但它会使处理内存变得更加困难。然而,如果初始化所有游戏状态,游戏的开始会阻碍性能?
答案 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方法)。