C++ 游戏状态系统

标签 c++ state

好的:总的来说,我对 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/

相关文章:

machine-learning - 近端策略优化中的状态可以包含历史吗?

android - 通过样式更改背景颜色

javascript - React 不会重新渲染更新的数组状态

javascript - React,如何从 parent 那里访问 child 的状态?无需更新 parent 的状态

c++ - 依赖本地对象以 C++ 中构造的相反顺序被破坏是一种不好的做法吗

c++ - 指针变量和引用变量有什么区别?

javascript - 本例中如何正确使用useState?

c++ - 为什么使用 DrawText API 绘制时我的字体边缘不平滑?

c++ - Windows 10 中非事件桌面上的 PrintWindow

c++ - 检测 32 位双字 + 双字进位/C++