【星际2编辑器】教程:使用触发器控制 XML 自定义 UI
随着星际争霸2地图开发对 UI 精细度要求的提高,传统的“触发器动作创建控件”方式已难以满足复杂的界面需求。目前主流的高级 UI 开发采用了 SC2Layout (XML) 与 触发器 (Triggers) 分离的架构。
本文将基于实际案例(生产面板初始化),讲解如何在触发器中加载 XML 模板,并通过 DialogControlHookup 获取控件句柄进行动态控制。
1. 核心原理
- **XML (Layout)**:定义界面的布局、纹理、位置和层级结构。
- **触发器 (Trigger)**:负责逻辑控制(如数据绑定、事件响应)。
- 交互桥梁:
DialogControlHookup函数。
2. XML 布局定义 (Layout XML)
在编写触发器之前,我们需要先定义好 XML 布局。以下是一个基础的示例代码,其中定义的 name 属性将直接对应后续触发器中的 Hookup 参数。
1 |
|
3. 触发器实现流程详解
以下逻辑基于 Map Initialization(地图初始化)事件:
第一步:创建基础容器 (Base Dialog)
XML 布局需要依附于一个运行时的 Dialog 对象。
- 动作:
对话框 - 创建一个标准对话框...对话框 - 显示 (最后创建的对话框)...
- 说明:此对话框通常作为透明的根容器。
第二步:实例化模板 (Instantiate Template)
将静态的 XML 定义加载到游戏中。
- 动作:
对话框 - 使用模板 MyPanel_Template/MyPanel_Template 为对话框 (最后创建的对话框) 创建一个面板 - 关键参数:
MyPanel_Template: 对应编辑器中导入的 Layout 文件描述符。MyPanel_Template: XML 文件中顶层<Frame type="Panel">的name属性。
第三步:获取根节点句柄 (Save Handle)
模板加载后,必须立即保存其根控件的引用,后续所有的子控件查找都将基于此变量。
- 动作:
变量 - 设置 g_生产面板 = (最后创建的对话框控件) - 说明:
g_生产面板建议定义为全局变量,以便在其他触发器(如按钮点击事件)中调用。
第三步:控件挂钩 (Hookup)
这是实现动态交互的核心步骤。通过路径查找 XML 中的子控件,并修改其属性。
- 动作示例:
从模板中创建对话框控件 - 将 DialogControlHookup(g_生产面板, 1, "Label_P1") 的文本设置为 "test11"
(注:在标准动作界面中,Hookup 函数通常位于“对话框控件”参数下的函数列表中)
DialogControlHookup 函数参数解析:
该函数用于返回指定路径下的控件句柄。
- **Parent (父控件)**:
- 传入
g_生产面板。指明从哪个容器开始查找。
- 传入
- **Type (控件类型)**:
- 必须与 XML 中定义的标签类型严格匹配。
1=Label(文本框)Button= 按钮Image= 图片- 注意:如果类型不匹配,将无法获取到控件。
- **Name (控件名称)**:
- 对应 XML 标签中的
name属性(例如<Frame type="Label" name="Label_P1">)。 - 重要:此参数大小写敏感,必须完全一致。
- 对应 XML 标签中的
4. 常见问题与注意事项
- 路径层级:
DialogControlHookup默认查找直接子节点。如果 XML 结构较深(如Panel -> Group -> Label),需要确保路径引用的正确性,或者连续调用 Hookup。 - 性能建议:不要在循环或高频触发器(如 0.0s 计时器)中反复执行 Hookup 操作。正确的做法是在初始化阶段获取所有关键控件的句柄,保存到变量数组中,后续直接操作变量。
- 调试技巧:如果 Hookup 失败(UI 不变),请优先检查 XML 中的
name拼写以及控件类型是否选择正确。