c++ - 使用 Composite Pattern 制作游戏菜单

标签 c++ menu sfml game-development composite

我正在使用复合模式制作游戏菜单。我想实现一个树形结构游戏菜单,其中一些叶子在我的状态机顶部插入新状态,另一个选项应该显示例如 slider 以更改音量而不产生新状态,另一个(退出)应该关闭游戏通过运行 sfml 方法。
有人可以给我一个更好的主意,而不是通过 operation() 方法将字符串或枚举返回到菜单状态,以通过在 if/switch 中使用值来运行预期的操作吗?

最佳答案

这是一个使用 struct 的菜单状态表示例。 :

typedef void (*Function_Pointer)(); // Declares a synonym for Function_Pointer
struct Table_Entry
{
    char  expected_selection;
    char  * prompt;
    Function_Ptr processing_function;
};

// Forward declarations
void Turn_On_Lights();
void Turn_Right();
void Open_Treasure();

// State table
static const Table_Entry menu1[] = 
{
    {'1', "Turn on lights", Turn_On_Lights},
    {'2', "Turn right (pivot)", Turn_Right},
    {'3', "Open Treasure", Open_Treasure},
};
static size_t menu_entry_quantity = 
    sizeof(menu1) / sizeof(menu1[0]);

void Display_Menu()
{
    for (unsigned int i = 0, i < menu_entry_quantity; ++i)
    {
        std::cout << menu1[i].expected_selection
                  << ". "
                  << menu1[i].prompt
                  << "\n";
    }
    std::cout << "Enter selection: ";
}

void Execute_Menu_Selection(char selection)
{
    for (unsigned int i = 0, i < menu_entry_quantity; ++i)
    {
        if (selection == menu1[i].expected_selection)
        {
            (*menu1[i].processing_function)();
            break;
        }
    }
}
上述代码允许您更改条目数量或条目内容,而无需重新测试功能。 (好的)
由于数据是静态常量,因此可以直接访问,无需在程序启动前进行初始化。
您可以通过使用“过渡”列或成员来扩展它。例如,列出在给定转换 ID 时要转换到的下一个状态(或菜单)。

关于c++ - 使用 Composite Pattern 制作游戏菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63004961/

相关文章:

c++ - 这个用户定义的转换没有歧义吗?如果可以,什么规则允许这样做?

c++ - 如何使用 CRTP 创建带有基类的可选模板参数?

c++ - 如何在循环 C++ 中使用 getline

html - 如何为我的 Wordpress 元素创建固定位置的侧边栏

c++ - 设计一个环绕的菜单? C++/面向对象

c++ - 为什么该代码不绘制 Sprite C++ SFML

c++ - 使用 SFML 绘制文本时出现段错误

c++ - 如何使用单个字母组成单词

CSFML 意外的重复纹理行为

javascript - 手机菜单无法实时触发