首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用复合模式制作游戏菜单

问使用复合模式制作游戏菜单
EN

Stack Overflow用户
提问于 2020-07-21 06:56:44
回答 1查看 118关注 0票数 2

我正在制作一个使用复合模式的游戏菜单。我想要实现一个树形结构的游戏菜单,其中一些叶子在我的状态机的顶部推送新的状态,另一个在选项中应该显示例如滑块来改变音量而不产生新的状态,另一个(退出)应该通过运行sfml方法来关闭游戏。

有人能给我一个比使用if/switch中的值将string或enum by operation()方法返回到菜单状态来运行预期操作更好的主意吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-21 07:36:08

下面是一个使用struct的菜单状态表的示例

代码语言:javascript
复制
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;
        }
    }
}

上面的代码允许您更改条目的数量或条目内容,而无需重新测试函数。(很好)

由于数据是静态常量,因此可以直接访问,不需要在程序启动前进行初始化。

您可以通过使用"transition“列或成员来扩展它。例如,列出在给定转换ID时要转换到的下一个状态(或菜单)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63004961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档