好的:总的来说,我对 C++ 和静态语言还很陌生。来自多年的 ruby (和其他动态语言)我不知道这是否可能。
我一直在为……游戏制作游戏状态系统。我想让系统易于剪切和粘贴到其他游戏中,而无需任何(或很少)更改。
我想改进的两件事是状态切换的方式和状态指针的保存方式。
可能有任意数量的状态,但内存中始终至少有 2 到 3 个状态处于事件状态。
丑陋第一。
目前我有一个状态管理器类,里面有这样的东西:
void StateManager::changeState(StateID nextStateID)
{
// UNFOCUS THE CURRENT STATE //
if (currentState())
{
currentState()->onUnFocus();
// DESTROY THE STATE IF IT WANTS IT //
if(currentState()->isDestroyedOnUnFocus()) {
destroyCurrentState();
}
}
if (m_GameStates[nextStateID]) {
// SWITCH TO NEXT STATE //
setCurrentState(nextStateID);
}
else
{
// CREATE NEW STATE //
switch (nextStateID)
{
case MainMenuStateID:
m_GameStates[MainMenuStateID] = new MainMenuState;
break;
case GameStateID:
m_GameStates[MainMenuStateID] = new GameStates;
break;
};
setCurrentState(nextStateID);
}
// FOCUS NEXT STATE //
currentState()->onFocus();
}
这种方法可行,但我觉得不是很好。
是否可以传递类型?然后在上面调用 new?
new NextGameState; // Whatever type that may be.
多态性在这方面有帮助吗?所有状态都派生自 State 类
。
丑陋之二。
我认为需要改进的另一件事是我存储状态的方式。
State* m_GameStates[MaxNumberOfStates];
所有状态都初始化为 NULL,因此我可以测试状态是否存在,如果不存在,它会在需要时创建一个。
它运作良好,我可以调用当前状态:
m_GameStates[m_CurrentState];
但是,出于两个原因,我不喜欢这个。当任何时候只有 2 或 3 个指针处于事件状态时,拥有一个充满 NULL 指针的数组似乎有点浪费。 [编者注:第二个原因是什么?]
我考虑过将其转换为 vector_ptr
,但没有考虑,因为它会在检查状态是否存在时产生额外的复杂性。 vector 似乎强化了丑陋一号。因为我需要一个列表来检查每个状态。
感谢任何建议或指导。
谢谢, 菲尔。
最佳答案
使用枚举(eration)来定义所有可能的状态(它有点像带有常量的列表)。 只需为一个对象创建一个变量来保存状态,并在需要更改时更改变量。
关于C++ 游戏状态系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3239546/