让玩家爱不释手的操作体验:开发者只需简单配置树形结构,即可实现流畅的层级导航、快捷动作触发和智能光标记忆,打造高效的菜单交互!
![]() 预览 | ![]() 预览 |
特性描述
🎮 基础操作
- 开启/关闭:长按近战键打开菜单,再次按下关闭
- 导航控制:
A
键:返回上级菜单D
键:前进或确认选项W/S
键:上下切换选项,长按可快速翻页
🌲 树形结构管理
层级索引系统
menu_tree
:动态记录每层选择的索引路径(如[3,2,1]
表示第0层选索引3,第1层选2,第2层选1)menu_treename
:存储每层选择的文本内容(如["主菜单", "武器库"]
)menu_treeindex
:支持跨层级索引查询(可访问深层选项)
动态页面生成
- 通过
menu_text
定义选项文本数组 - 通过
menu_content
定义选项备注数组 - 修改数组内容即可实时更新菜单显示
- 通过
🔄 智能交互特性
- 光标记忆:返回上级时自动定位到上次选择的选项
- 空页面保护:无选项时自动生成“返回上级”条目
- 快速刷新:调用
refresh_menu
子程序或直接修改menu_text
/menu_content
可实时更新页面 - 多级动作集成:深层选项可直接触发游戏行为(如切换英雄、生成机器人)
💻 编程扩展性
核心逻辑在
html
子程序:- 通过
menu_state[3]
(当前深度)和menu_tree
路径定位选项 - 分层级编写菜单内容(示例提供深度0~3的完整模板)
- 通过
两种开发模式:
- 深度优先:逐层嵌套逻辑(适用于线性流程)
- 树分叉优先:按分支独立编写(适用于复杂树状菜单)
快捷跳转系统:
- 实现跨树节点跳转(如从“设置”直达“英雄选择”)
- 支持多级跳转队列管理
📊 可视化优化
- 分页显示:超过6个选项自动分页,显示页码(如
◇◇第1/3页◇◇
) - 标题动态生成:自动拼接层级路径(如
主菜单 > 武器库 > 近战武器
) - 选中状态标识:当前选项以
●
高亮标记
典型应用场景
- 游戏系统菜单:角色设置、武器选择、技能配置
- 动态交互界面:实时更新的任务列表或商店系统
- 多级控制面板:管理员工具、游戏模式切换
- 快捷操作入口:一键跳转高频功能(如“重新开始”直达确认框)
通过树形结构+状态机的设计,实现了高灵活性的菜单系统,开发者可基于示例快速扩展复杂交互逻辑。
代码详解
变量 | 描述 |
---|---|
menu_tree | 树结构本体,储存每层选择的索引,无法查询更深层,例如数组(3,2,1)代表在第0层选择了索引3、第1层选择索引2,第2层选择索引1 |
menu_treename | 储存每层选择的内容 |
menu_text | 当前页面所有的选项内容 |
menu_content | 当前页面所有的选项备注,与menu_text对应 |
menu_treeindex | 储存每层选择的索引,可以查询更深层。如果某个页面需要查询它的下级页面选择的索引,则需要使用该变量 |
menu_state[3] | 当前页面的深度 |
menu_state[4] | 当前页面标题,有默认值生成方式,也可自行定义 |
menu_state[5] | 当前页面每页最大行数,取值1~6;默认6 |
menu_state[12] | 定义当前页面选项的前进操作(D),为0则打开新页面,为1则返回上级,其他值为无动作,或者可以自行定义其他动作,对当前页面所有选项生效;默认0 |
menu_state[17] | 打开当前页面时,往回后退menu_state[17]个页面,用于不需要页面的动作型选项 |
menu_state[24] | 快捷方式参数,用于跳转到另一处位置,格式与menu_tree一致,一般用于代码复用 |
menu_state[25] | 规定了快捷方式跳转后返回操作时,应该回到跳转前的位置还是上一级位置,为0代表跳转后返回时仍然回到跳转前的位置(支持队列多跳),为1代表按照正常的树结构返回(注意会清除跳转记录队列) |
教程:如何编写菜单的 html
子程序
📌 核心原则
- 树形结构驱动:菜单层级由
menu_tree
数组控制(当前路径为menu_tree[深度]
) - 深度优先编写:根据
menu_state[3]
(当前深度)编写对应层级的菜单 - 动态内容绑定:通过修改
menu_text
和menu_content
定义选项内容
🧩 编写步骤
步骤 1:定位当前深度
在 html
子程序中,先确定当前菜单深度:
If(事件玩家.menu_state[3] == 0); // 主菜单层
"在这里编写主菜单"
Else If(事件玩家.menu_state[3] >= 1); // 子菜单层
"在这里编写子菜单"
End;
步骤 2:按分支编写菜单
根据 menu_tree
中的索引值创建分支逻辑:
// 示例:主菜单选项分支
If(事件玩家.menu_tree[1] == 0); // 选项0: 多级菜单示例
"编写选项0的子菜单"
Else If(事件玩家.menu_tree[1] == 1); // 选项1: 动作类型示例
"编写选项1的子菜单"
Else If(事件玩家.menu_tree[1] == 2); // 选项2: 树分叉写法
"编写选项2的子菜单"
// ... 其他选项
End;
步骤 3:定义菜单内容
使用字符串分割定义选项数组:
// 定义菜单选项文本 (用 \\ 分隔)
事件玩家.menu_text = 字符串分割(自定义字符串("选项1\\选项2\\选项3"), 自定义字符串("\\"));
// 定义选项备注文本 (可选)
事件玩家.menu_content = 字符串分割(自定义字符串("备注1\\备注2\\备注3"), 自定义字符串("\\"));
🎯 关键技巧
技巧 1:动作类型选项
// 示例:执行动作后返回
If(事件玩家.menu_tree[2] == 0); // 特定选项
事件玩家.menu_state[17] = 1; // 执行后返回1层
交流(事件玩家, 语音(上)); // 执行具体动作
End;
技巧 2:动态内容加载
// 示例:加载英雄列表
事件玩家.menu_text = 全部英雄; // 直接使用游戏数组
技巧 3:快捷跳转
// 设置跳转到 [1,1,1] 路径
事件玩家.menu_state[24] = 数组(1,1,1);
事件玩家.menu_state[25] = 0; // 0=记忆位置, 1=正常返回
🧭 开发模板
规则("html 菜单编写指南")
{
事件
{
子程序;
html;
}
动作
{
// ====== 主菜单层 (深度0) ======
If(事件玩家.menu_state[3] == 0);
事件玩家.menu_text = 字符串分割(自定义字符串("功能1\\功能2\\设置\\关于"), 自定义字符串("\\"));
事件玩家.menu_content = 字符串分割(自定义字符串("功能1说明\\功能2说明\\系统设置\\作者信息"), 自定义字符串("\\"));
// ====== 子菜单层 (深度≥1) ======
Else If(事件玩家.menu_state[3] >= 1);
// --- 分支1:功能1 ---
If(事件玩家.menu_tree[1] == 0);
// 深度1菜单
If(事件玩家.menu_state[3] == 1);
事件玩家.menu_text = 字符串分割(自定义字符串("子功能A\\子功能B\\返回"), 自定义字符串("\\"));
// 深度2菜单
Else If(事件玩家.menu_state[3] == 2);
// 子功能A
If(事件玩家.menu_tree[2] == 0);
事件玩家.menu_state[17] = 1; // 执行后返回1层
播放效果(事件玩家, 好的音效); // 执行具体功能
// 子功能B
Else If(事件玩家.menu_tree[2] == 1);
事件玩家.menu_text = 可用物品列表; // 加载动态内容
End;
End;
// --- 分支2:系统设置 ---
Else If(事件玩家.menu_tree[1] == 2);
// 深度1菜单
If(事件玩家.menu_state[3] == 1);
事件玩家.menu_text = 字符串分割(自定义字符串("音量设置\\画面设置\\快捷跳转"), 自定义字符串("\\"));
// 深度2菜单:快捷跳转
Else If(事件玩家.menu_state[3] == 2 && 事件玩家.menu_tree[2] == 2);
事件玩家.menu_state[24] = 数组(0,0); // 跳转到主菜单的选项0
事件玩家.menu_state[25] = 1; // 使用正常返回
End;
End;
End;
}
}
提示:所有开发都在
html
子程序内完成,保持default_page
的默认设置,通过menu_state
参数控制特殊行为
完整代码
变量
{
玩家:
0: menu_content
1: menu_state
2: menu_text
3: menu_dqtext
4: menu_tree
5: menu_treename
6: menu_treeindex
}
子程序
{
0: html
1: refresh_menu
2: default_page
3: refresh_menupage
}
规则("老王不在橱柜 玩家初始化 不需要修改")
{
事件
{
持续 - 每名玩家;
队伍1;
全部;
}
动作
{
事件玩家.menu_tree = 数组(0);
事件玩家.menu_treename = 数组(自定义字符串("主菜单"));
事件玩家.menu_state[20] = 自定义字符串("打开菜单");
事件玩家.menu_state[21] = 自定义字符串("长按");
事件玩家.menu_state[22] = 自定义字符串("————————————————————————————————————————————————————————————————————————————————————————————");
创建HUD文本(事件玩家, 自定义字符串("{0}", 自定义字符串("{1}{0}{2}", 输入绑定字符串(按钮(近身攻击)), 事件玩家.menu_state[21], 事件玩家.menu_state[20])), 空, 空, 左边, 9, 颜色(橙色),
颜色(白色), 颜色(白色), 可见和字符串, 默认可见度);
事件玩家.menu_state[14] = 上一个文本ID;
中止;
事件玩家.menu_tree[0] = 0;
事件玩家.menu_tree[1] = 2;
事件玩家.menu_state[26] = 空数组;
事件玩家.menu_state[27] = 空数组;
事件玩家.menu_treename[1] = 自定义字符串("说明");
}
}
规则("老王不在橱柜 打开背包 不需要修改")
{
事件
{
持续 - 每名玩家;
队伍1;
全部;
}
条件
{
按钮被按下(事件玩家, 按钮(近身攻击)) == 真;
}
动作
{
If(事件玩家.menu_state[0] == 真);
事件玩家.menu_state[20] = 自定义字符串("打开菜单");
事件玩家.menu_state[21] = 自定义字符串("长按");
停止限制阈值(事件玩家);
事件玩家.menu_state[0] = 假;
消除HUD文本(事件玩家.menu_state[1]);
消除HUD文本(事件玩家.menu_state[2]);
中止;
End;
等待(0.500, 当为“假”时中止);
If(事件玩家.menu_state[0] == 假);
事件玩家.menu_state[20] = 自定义字符串("关闭菜单\r\nWS上下 A返回 D确认");
事件玩家.menu_state[21] = 自定义字符串("按下");
开始限制阈值(事件玩家, 0, 0.010, 0, 0.010, 0, 0.010);
事件玩家.menu_state[0] = 真;
事件玩家.menu_state[13] = 1;
调用子程序(refresh_menu);
创建HUD文本(事件玩家, 事件玩家.menu_content[事件玩家.menu_state[6]] ? 事件玩家.menu_content[事件玩家.menu_state[6]] : 自定义字符串(""), 空, 空, 左边, 11, 颜色(橙色), 颜色(
白色), 颜色(白色), 可见和字符串, 默认可见度);
事件玩家.menu_state[2] = 上一个文本ID;
创建HUD文本(事件玩家, 自定义字符串("◇{0}\r\n——————————{1}{2}", 事件玩家.menu_state[4], 自定义字符串("{0}{1}", 自定义字符串("{0}{1}{2}",
事件玩家.menu_dqtext[0] ? 自定义字符串("\r\n{0}{1}", 事件玩家.menu_state[7] == 0 ? 自定义字符串("● ") : 自定义字符串("○ "), 事件玩家.menu_dqtext[0])
: 自定义字符串(""), 事件玩家.menu_dqtext[1] ? 自定义字符串("\r\n{0}{1}", 事件玩家.menu_state[7] == 1 ? 自定义字符串("● ") : 自定义字符串("○ "),
事件玩家.menu_dqtext[1]) : 自定义字符串(""), 事件玩家.menu_dqtext[2] ? 自定义字符串("\r\n{0}{1}", 事件玩家.menu_state[7] == 2 ? 自定义字符串("● ") : 自定义字符串(
"○ "), 事件玩家.menu_dqtext[2]) : 自定义字符串("")), 自定义字符串("{0}{1}{2}", 事件玩家.menu_dqtext[3] ? 自定义字符串("\r\n{0}{1}",
事件玩家.menu_state[7] == 3 ? 自定义字符串("● ") : 自定义字符串("○ "), 事件玩家.menu_dqtext[3]) : 自定义字符串(""), 事件玩家.menu_dqtext[4] ? 自定义字符串(
"\r\n{0}{1}", 事件玩家.menu_state[7] == 4 ? 自定义字符串("● ") : 自定义字符串("○ "), 事件玩家.menu_dqtext[4]) : 自定义字符串(""),
事件玩家.menu_dqtext[5] ? 自定义字符串("\r\n{0}{1}", 事件玩家.menu_state[7] == 5 ? 自定义字符串("● ") : 自定义字符串("○ "), 事件玩家.menu_dqtext[5])
: 自定义字符串(""))), 事件玩家.menu_state[9] > 1 ? 自定义字符串("\r\n◇◇第{0}/{1}页◇◇", 事件玩家.menu_state[8] + 1, 事件玩家.menu_state[9]) : 自定义字符串("")),
空, 空, 左边, 10, 颜色(橙色), 颜色(白色), 颜色(白色), 可见和字符串, 默认可见度);
事件玩家.menu_state[1] = 上一个文本ID;
End;
}
}
规则("老王不在橱柜 打开菜单操作 不需要修改")
{
事件
{
持续 - 每名玩家;
队伍1;
全部;
}
条件
{
事件玩家.menu_state[0] == 真;
阈值(事件玩家) != 矢量(0, 0, 0);
}
动作
{
"左"
If(X方向分量(阈值(事件玩家)) > 0);
If(数量(事件玩家.menu_tree) > 1);
修改玩家变量(事件玩家, menu_tree, 根据索引从数组中移除, 数量(事件玩家.menu_tree) - 1);
事件玩家.menu_state[13] = 1;
调用子程序(refresh_menu);
End;
"右"
Else If(X方向分量(阈值(事件玩家)) < 0);
事件玩家.menu_state[11] = 事件玩家.menu_state[6];
事件玩家.menu_state[16] = 事件玩家.menu_text[事件玩家.menu_state[11]];
事件玩家.menu_treename[事件玩家.menu_state[3] + 1] = 事件玩家.menu_state[16];
事件玩家.menu_treeindex[事件玩家.menu_state[3] + 1] = 事件玩家.menu_state[11];
"选择"
If(事件玩家.menu_state[12] == 0);
修改玩家变量(事件玩家, menu_tree, 添加至数组, 事件玩家.menu_state[11]);
事件玩家.menu_state[13] = 0;
调用子程序(refresh_menu);
"返回"
Else If(事件玩家.menu_state[12] == 1);
修改玩家变量(事件玩家, menu_tree, 根据索引从数组中移除, 数量(事件玩家.menu_tree) - 1);
事件玩家.menu_state[13] = 1;
调用子程序(refresh_menu);
"无动作"
Else If(事件玩家.menu_state[12] == -1);
End;
"上"
Else If(Z方向分量(阈值(事件玩家)) > 0);
事件玩家.menu_state[6] -= 1;
事件玩家.menu_state[7] -= 1;
If(事件玩家.menu_state[6] < 0);
事件玩家.menu_state[6] = 事件玩家.menu_state[10] - 1;
事件玩家.menu_state[7] = 事件玩家.menu_state[6] % 事件玩家.menu_state[5];
事件玩家.menu_state[8] = 事件玩家.menu_state[9] - 1;
调用子程序(refresh_menupage);
Else If(事件玩家.menu_state[7] < 0);
事件玩家.menu_state[7] = 事件玩家.menu_state[5] - 1;
事件玩家.menu_state[8] -= 1;
调用子程序(refresh_menupage);
End;
根据条件中止(事件玩家.menu_state[9] <= 1);
等待直到 (Z方向分量(阈值(事件玩家)) <= 0, 0.400);
While(Z方向分量(阈值(事件玩家)) > 0);
事件玩家.menu_state[8] -= 1;
事件玩家.menu_state[6] -= 事件玩家.menu_state[5];
If(事件玩家.menu_state[8] < 0);
事件玩家.menu_state[8] = 事件玩家.menu_state[9] - 1;
事件玩家.menu_state[6] = 事件玩家.menu_state[10] - 1;
事件玩家.menu_state[7] = 事件玩家.menu_state[6] % 事件玩家.menu_state[5];
End;
调用子程序(refresh_menupage);
等待直到 (Z方向分量(阈值(事件玩家)) <= 0, 0.400);
End;
"下"
Else If(Z方向分量(阈值(事件玩家)) < 0);
事件玩家.menu_state[6] += 1;
事件玩家.menu_state[7] += 1;
If(事件玩家.menu_state[6] >= 事件玩家.menu_state[10]);
事件玩家.menu_state[6] = 0;
事件玩家.menu_state[7] = 0;
事件玩家.menu_state[8] = 0;
调用子程序(refresh_menupage);
Else If(事件玩家.menu_state[7] >= 事件玩家.menu_state[5]);
事件玩家.menu_state[7] = 0;
事件玩家.menu_state[8] += 1;
调用子程序(refresh_menupage);
End;
根据条件中止(事件玩家.menu_state[9] <= 1);
等待直到 (Z方向分量(阈值(事件玩家)) >= 0, 0.400);
While(Z方向分量(阈值(事件玩家)) < 0);
事件玩家.menu_state[8] += 1;
事件玩家.menu_state[6] += 事件玩家.menu_state[5];
If(事件玩家.menu_state[8] > 事件玩家.menu_state[9] - 1);
事件玩家.menu_state[8] = 0;
事件玩家.menu_state[6] = 0;
事件玩家.menu_state[7] = 0;
Else If(事件玩家.menu_state[6] > 事件玩家.menu_state[10] - 1);
事件玩家.menu_state[6] = 事件玩家.menu_state[10] - 1;
事件玩家.menu_state[7] = 事件玩家.menu_state[6] % 事件玩家.menu_state[5];
End;
调用子程序(refresh_menupage);
等待直到 (Z方向分量(阈值(事件玩家)) >= 0, 0.400);
End;
End;
}
}
规则("老王不在橱柜 refresh_menu 更新背包页面 不需要修改")
{
事件
{
子程序;
refresh_menu;
}
动作
{
While(真);
事件玩家.menu_state[17] = 0;
事件玩家.menu_state[19] = 0;
事件玩家.menu_state[25] = 0;
"当前深度"
事件玩家.menu_state[3] = 数量(事件玩家.menu_tree) - 1;
调用子程序(default_page);
调用子程序(html);
"快捷方式"
If(事件玩家.menu_state[24] != 空);
事件玩家.menu_state[19] = 1;
If(事件玩家.menu_state[25] == 1);
事件玩家.menu_state[26] = 空数组;
事件玩家.menu_state[27] = 空数组;
Else;
事件玩家.menu_state[26] = 添加至数组(事件玩家.menu_state[26], 数组(数组分割(事件玩家.menu_state[24], 0, 数量(事件玩家.menu_state[24])-1)));
事件玩家.menu_state[27] = 添加至数组(事件玩家.menu_state[27], 数组(数组分割(事件玩家.menu_tree, 0, 数量(事件玩家.menu_tree)-1)));
End;
事件玩家.menu_tree = 事件玩家.menu_state[24];
事件玩家.menu_state[24] = 空;
End;
"快捷方式跳回"
If(事件玩家.menu_state[26] != 空 && 最后(事件玩家.menu_state[26]) == 事件玩家.menu_tree);
事件玩家.menu_state[19] = 1;
事件玩家.menu_tree = 最后(事件玩家.menu_state[27]);
事件玩家.menu_state[26] = 数组分割(事件玩家.menu_state[26], 0, 数量(事件玩家.menu_state[26])-1);
事件玩家.menu_state[27] = 数组分割(事件玩家.menu_state[27], 0, 数量(事件玩家.menu_state[27])-1);
End;
"阻止打开新页面并刷新"
While(事件玩家.menu_state[17] > 0);
事件玩家.menu_state[17] -= 1;
事件玩家.menu_state[19] = 1;
修改玩家变量(事件玩家, menu_tree, 根据索引从数组中移除, 数量(事件玩家.menu_tree) - 1);
事件玩家.menu_state[13] = 1;
End;
If(事件玩家.menu_state[19] == 0);
中断;
End;
End;
"为空则添加返回上级选项"
If(事件玩家.menu_text == 空数组);
事件玩家.menu_text = 数组(自定义字符串("没有内容->返回"));
事件玩家.menu_state[12] = 1;
End;
事件玩家.menu_state[10] = 数量(事件玩家.menu_text);
"下标位置不能超出数量"
事件玩家.menu_state[6] = 较小(事件玩家.menu_state[6], 事件玩家.menu_state[10] - 1);
"总页数(从1开始)"
事件玩家.menu_state[9] = 取整(较大(0, 事件玩家.menu_state[10] - 0) / 事件玩家.menu_state[5], 上);
"当前页选中的行的下标(0~最大行数-1)"
事件玩家.menu_state[7] = 事件玩家.menu_state[6] % 事件玩家.menu_state[5];
"当前页数(从0开始)"
事件玩家.menu_state[8] = 取整((0 + 事件玩家.menu_state[6]) / 事件玩家.menu_state[5], 下);
"更新当前页面"
调用子程序(refresh_menupage);
}
}
规则("老王不在橱柜 default_page 默认页面属性 定义了页面的默认生成方式 按需要进行修改")
{
事件
{
子程序;
default_page;
}
动作
{
"每页最大行数,不能超过6"
事件玩家.menu_state[5] = 6;
"页面标题,这里提供了两种标题方法,如需切换,启用该动作并禁用下面6条动作"
禁用 事件玩家.menu_state[4] = 事件玩家.menu_treename[事件玩家.menu_state[3] + 0];
"生成页面标题"
事件玩家.menu_state[23] = 0;
事件玩家.menu_state[4] = 自定义字符串("主菜单");
While(事件玩家.menu_state[23] < 事件玩家.menu_state[3]);
事件玩家.menu_state[4] = 自定义字符串("{0}\r\n{1}{2}", 事件玩家.menu_state[4], 截取字符串(事件玩家.menu_state[22], 0, 1 * (事件玩家.menu_state[23] + 1)),
事件玩家.menu_treename[事件玩家.menu_state[23] + 1]);
事件玩家.menu_state[23] += 1;
End;
"当前页面是否为新打开"
If(事件玩家.menu_state[13] == 1);
"为1则光标置于记录点位置"
事件玩家.menu_state[6] = 事件玩家.menu_treeindex[事件玩家.menu_state[3] + 1];
事件玩家.menu_state[13] = 0;
Else;
"为0则将光标置于0"
事件玩家.menu_state[6] = 0;
End;
"文本数据数组"
事件玩家.menu_text = 空数组;
"右键的操作,0钻取 1返回上一级 2自定义 (对所有行生效)"
事件玩家.menu_state[12] = 假;
"文本备注数组"
事件玩家.menu_content = 空数组;
}
}
规则("老王不在橱柜 refresh_menupage 更新背包当前页面,有时候需要动态更新可以使用该子程序 不需要修改")
{
事件
{
子程序;
refresh_menupage;
}
动作
{
事件玩家.menu_dqtext = 数组分割(事件玩家.menu_text, 事件玩家.menu_state[8] * 事件玩家.menu_state[5], 事件玩家.menu_state[5]);
}
}
规则("老王不在橱柜 html 菜单界面 需要自己编写")
{
事件
{
子程序;
html;
}
动作
{
If(事件玩家.menu_state[3] == 0);
"选项文本"
事件玩家.menu_text = 字符串分割(自定义字符串("选项0\\选项1\\选项2\\关于\\快捷方式"), 自定义字符串("\\"));
"备注文本"
事件玩家.menu_content = 字符串分割(自定义字符串("多级菜单示例\\动作类型选项示例\\树分叉优先写法\\关于\\快捷方式"), 自定义字符串("\\"));
Else If(事件玩家.menu_state[3] >= 1);
"选项0 多级菜单示例"
If(事件玩家.menu_tree[1] == 0);
"深度为1"
If(事件玩家.menu_state[3] == 1);
事件玩家.menu_text = 字符串分割(自定义字符串("选项0-0\\选项0-1\\选项0-2"), 自定义字符串("\\"));
"深度为2"
Else If(事件玩家.menu_state[3] == 2);
"选项0-0-"
If(事件玩家.menu_tree[2] == 0);
"不钻取下一层"
事件玩家.menu_state[12] = -1;
事件玩家.menu_text = 字符串分割(自定义字符串("选项0-0-0\\选项0-0-1\\选项0-0-2"), 自定义字符串("\\"));
"选项0-1-"
Else If(事件玩家.menu_tree[2] == 1);
"继续钻取下一层,若没有内容则自动添加一个返回上级的选项,此为默认值"
事件玩家.menu_state[12] = 0;
事件玩家.menu_text = 字符串分割(自定义字符串("选项0-1-0\\选项0-1-1\\选项0-1-2"), 自定义字符串("\\"));
End;
End;
"选项1 动作类型选项示例"
Else If(事件玩家.menu_tree[1] == 1);
"深度为1"
If(事件玩家.menu_state[3] == 1);
事件玩家.menu_text = 字符串分割(自定义字符串("发送语音\\切换英雄\\添加机器人"), 自定义字符串("\\"));
"深度为2"
Else If(事件玩家.menu_state[3] == 2);
"发送你好动作"
If(事件玩家.menu_tree[2] == 0);
"打开该页面时,往回后退menu_state[17]即1个页面"
事件玩家.menu_state[17] = 1;
交流(事件玩家, 语音(上));
"切换英雄"
Else If(事件玩家.menu_tree[2] == 1);
事件玩家.menu_text = 全部英雄;
"添加机器人动作"
Else If(事件玩家.menu_tree[2] == 2);
"打开该页面时,往回后退menu_state[17]即1个页面"
事件玩家.menu_state[17] = 1;
生成机器人(英雄(D.Va), 所在队伍(事件玩家), -1, 所选位置(事件玩家), 所选位置(事件玩家));
End;
"深度为3"
Else If(事件玩家.menu_state[3] == 3);
"切换英雄动作,该定位的是深度为3,且tree[2]为1即“切换英雄”的子页面,这里的if判断可省略因为深度为3没有其他页面,但不建议,会导致语义理解困难,影响后续添加其他页面"
If(事件玩家.menu_tree[2] == 1);
"只需要执行动作,并不要显示新的页面,所以需要回退页面。打开该页面时,往回后退menu_state[17]即1个页面,也可以改成2。"
事件玩家.menu_state[17] = 1;
"menu_tree记录每层选择的选项索引,menu_treename记录每层选择的选项内容,这里的menu_treename[3]记录了上一级你选择的英雄"
开始强制玩家选择英雄(事件玩家, 事件玩家.menu_treename[3]);
End;
End;
"选项2 以上两个选项为深度优先写法,有时深度较大要使用树分叉优先写法"
Else If(事件玩家.menu_tree[1] == 2);
"深度为1"
If(事件玩家.menu_state[3] == 1);
事件玩家.menu_text = 字符串分割(自定义字符串("选项2-0\\选项2-1"), 自定义字符串("\\"));
"深度为2及以上"
Else;
"优先分叉 选项2-0-"
If(事件玩家.menu_tree[2] == 0);
"深度为2"
If(事件玩家.menu_state[3] == 2);
事件玩家.menu_text = 字符串分割(自定义字符串("选项2-0-0\\选项2-0-1"), 自定义字符串("\\"));
"深度为3及以上"
Else;
"选项2-0-0-"
If(事件玩家.menu_tree[3] == 0);
"深度为3 最末一层该If判断深度可省略"
If(事件玩家.menu_state[3] == 3);
事件玩家.menu_text = 字符串分割(自定义字符串("选项2-0-0-0\\选项2-0-0-1"), 自定义字符串("\\"));
End;
"选项2-0-1-"
Else If(事件玩家.menu_tree[3] == 1);
"深度为3 最末一层该If判断深度可省略"
If(事件玩家.menu_state[3] == 3);
事件玩家.menu_text = 字符串分割(自定义字符串("选项2-0-1-0\\选项2-0-1-1"), 自定义字符串("\\"));
End;
End;
End;
"优先分叉 选项2-1-"
Else If(事件玩家.menu_tree[2] == 1);
"深度为2"
If(事件玩家.menu_state[3] == 2);
事件玩家.menu_text = 字符串分割(自定义字符串("选项2-1-0\\选项2-1-1"), 自定义字符串("\\"));
"深度为3及以上"
Else;
"选项2-1-0-"
If(事件玩家.menu_tree[3] == 0);
"深度为3 最末一层该If判断深度可省略"
If(事件玩家.menu_state[3] == 3);
事件玩家.menu_text = 字符串分割(自定义字符串("选项2-1-0-0\\选项2-1-0-1"), 自定义字符串("\\"));
End;
"选项2-1-1-"
Else If(事件玩家.menu_tree[3] == 1);
"深度为3 最末一层该If判断深度可省略"
If(事件玩家.menu_state[3] == 3);
事件玩家.menu_text = 字符串分割(自定义字符串("选项2-1-1-0\\选项2-1-1-1"), 自定义字符串("\\"));
End;
End;
End;
End;
End;
"关于"
Else If(事件玩家.menu_tree[1] == 3);
If(事件玩家.menu_state[3] == 1);
事件玩家.menu_state[12] = -1;
事件玩家.menu_text = 字符串分割(自定义字符串("作者:老王不在橱柜\\Q群:863964203\\更新时间:2021-11-19\\熔火工坊链接"), 自定义字符串("\\"));
事件玩家.menu_content = 字符串分割(自定义字符串("\\\\\\owmod.net/work/view/1859"), 自定义字符串("\\"));
End;
"快捷方式"
Else If(事件玩家.menu_tree[1] == 4);
If(事件玩家.menu_state[3] == 1);
事件玩家.menu_text = 字符串分割(自定义字符串("快捷跳转到切换英雄"), 自定义字符串("\\"));
Else If(事件玩家.menu_state[3] == 2);
"跳转目标,参数为menu_state[24],格式与menu_tree一致"
事件玩家.menu_state[24] = 数组(1,1,1);
"代表跳转之后再返回时,是回到跳转前的位置(默认0),还是按照正常的树结构返回(1,注意会删除所有跳点)"
事件玩家.menu_state[25] = 0;
End;
End;
End;
}
}
评论
这里空空如也~