【发布时间】:2011-03-15 10:48:12
【问题描述】:
好的:总的来说,我对 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.
多态性在这里有帮助吗?所有状态都来自class State。
丑陋之二。
我认为需要改进的另一件事是我存储状态的方式。
State* m_GameStates[MaxNumberOfStates];
所有状态都被初始化为 NULL,所以我可以测试一个状态是否存在,如果没有,它会在需要时创建一个。
效果很好,我可以调用当前状态:
m_GameStates[m_CurrentState];
但是,我不喜欢这个有两个原因。当任何时候只有 2 或 3 个指针处于活动状态时,拥有一个充满 NULL 指针的数组似乎有点浪费。 [编者注:第二个原因是什么?]
我曾考虑将其转换为vector_ptr,但没有这样做,因为它会在检查状态是否存在时产生额外的复杂性。而且这个向量似乎强化了第一号丑陋。因为我需要一个列表来检查每个状态。
任何建议或指导表示赞赏。
谢谢, 菲尔。
【问题讨论】:
-
为什么会有2-3个状态同时活跃?
-
对于您的第一个问题,您能否显示包含此开关的函数的签名?为了正确回答这个问题,我们需要知道函数长什么样,变量是什么类型。
-
@Georg,一些状态将保持活动状态以允许快速切换、主菜单/暂停菜单等。 @jalf pastie.org/1042747 全开关功能。
-
好的,我将完整功能编辑到您的问题中。 :)
-
StateID是typedef还是int或者它是如何定义的?