导图社区 魔兽争霸地图编辑器_UI详解
魔兽争霸地图编辑器的UI部分详细笔记,包括:frame父子关系、内置UI、在屏幕和框架上的位置等。
编辑于2022-09-24 22:57:42 四川省ui
基础
frame父子关系
操作
father的限制
注意
SimpleFrames 不能是 Frames 的子项或父项。frame不能是 SimpleFrames 的子项/父项。
现在有些人可能会说:“但我在 fdf 中为 SIMPLEFRAME 创建了一个 BUTTON,或者,我在游戏期间为一个 BUTTON 创建了 SIMPLEFRAME。”
是的,你做了,但是通过更准确的检查,通过比较新框架的父级的 HandleIds 和想要/应该是父级的人可能会看到它们不匹配,在这两种情况下你都会看到另一个框架的 handleId,我称之为替代父母。
当这种情况发生时,首先可能会想知道为什么可见性和其他父行为不适用。但原因:想要的父母不是真正的父母,所以它不会复制可见性/阿尔法...。
示例
这是一个创建可点击按钮的 Lua 代码,该按钮仅在玩家位于菜单 (F10) 内时可见,该代码在 Lua 模式下插入地图时自行执行。 单击按钮时,屏幕上会打印消息“菜单中的操作”。
使用 cascview 查看时,此菜单框架位于“ui/framedef/ui”中。 这是为魔兽争霸 3 V1.31.1 编写的。
按level的frame顺序
基础
当多个框架位于同一空间时,有一条规则告诉谁将接受鼠标事件并显示在顶部。
使用 BlzFrameSetLevel 设置的 FrameLevel 管理这一点,它仅在帧在屏幕上碰撞/重叠时才重要。
只有可见frame对 FrameLevel 顺序很重要。
操作
对于frame
FrameLevel 定义子框架在其父框架之上的顺序。
框架只与它们的兄弟姐妹竞争。
它们按降序排列。
Level 最高的 childFrame 位于 onTop
对于simpleFrame
基础
level最高的在上,亲子关系无所谓。
创建 SimpleFrame 时,它会复制父级的当前级别,因此它位于其上方。
但是可以更改级别以使父级位于顶部,这也意味着以后对父级级别的更改不会被子SimpleFrames 接管,除了纹理/字符串,它们会。
可以说两者都使用相同的规则,除了 Frames 开始新的 Layers 放置 Frame 的子项,而 SimpleFrames 只有一个 Layer,由 SimpleFrame Ancient 开始。
示例
GAMEUI之上是ButtonB,他拥有最高级别的GAMEUI。
ButtonBA 的 Level 比 ButtonBB 高,因此他在 ButtonB 之上。
ButtonBBA 是 ButtonBB 的子级,但它的父级 ButtonBB 低于 ButtonBA,因此他也低于 ButtonBA。
ButtonCA 和 ButtonCB 级别较高,但其父级 ButtonC 在 GAMEUI 中是最低的,因此它们也是最低的。
onTop Total 是 ButtonBA。
即由父级的level决定
内置UI
操作
fdf文件
ui\framedef\ui\simpleinfopanel.fdf
基础
它们都是 SimpleFrames
他们有同名的子框架,只有 createContext 不同。
界面
Esc菜单
帮助菜单
Esc->设置
参考
https://www.hiveworkshop.com/threads/default-names-for-blzgetframebyname.315846/
注意
该列表是通过读取/解释来自魔兽争霸 3 ptr 1.31 的所有 fdf 文件并读取“”中的所有单词而生成的
内部frame的注意事项
LeaderBoard/Multiboard/TimerDialog 仅在地图创建此类时才起作用。
LogDialog 仅在 SinglePlayer 中使用。
聊天框仅在多人游戏中使用。
单击任务按钮后创建任务框架(可以使用代码强制,第一行打开任务对话框,第二行关闭它)
调用 BlzFrameClick(BlzGetFrameByName("UpperButtonBarQuestsButton", 0))
调用 BlzFrameClick(BlzGetFrameByName("QuestAcceptButton", 0))
如果名称旁边没有 nr,则使用“0”。
例如BlzGetFrameByName("HelpTextArea",0)将返回处理帮助文本区域的框架。
在屏幕和框架上的位置
基础
《魔兽争霸 3》一开始只是一场 4:3 的比赛。因此他们自己的 UI-FrameWork 有一个对 4:3 部分有意义的坐标系。 位置从小地图左下角的 0.0/0.0 到右上角的 0.8/0.6(维护等级的右上角)
操作
有 4 个本地函数(重制版)可以用代码操纵 Frame 的位置
可以看出,魔兽的 UI 使用了一个名为 framepointtype 的类型,该类型在代码中的常量是:
当设置大小和位置时,可以将 Frames 想象为矩形。
相对位置
重制版函数
获取frame
魔兽争霸 3 的frame存储在一个可以读取名称和数字的存储中,这个数字称为 CreateContext。
BlzGetFrameByName("ConsoleUI", 0)在该存储中查找名为“ConsoleUI”且 CreateContext 为 0 的框架并返回对它的引用,或者在未找到时返回 null/nil。
即相同名称的frame使用id进行区分
注意这里的id并不是必须唯一的,可以使用相同的id
不同id的frame将存储在不同的位置,可以看成数组索引
如果id相同,那么后面的会替换前面的frame
注意这里的替换只是使用BlzGetFrameByName等函数时,只会获取到最新的frame,并不是说被覆盖的frame就不存在,只是没有建立索引,使用变量来存储不同frame即可使用它
还有另外 2 种访问帧的方法,一种是BlzGetOriginFrame允许获取 Blizzard 提供的特殊访问权限。
Warcraft 3 V1.32.6 的新功能可以在索引处获取 childFrame。使用这 2 个本地函数;
操作
内置ui
获取内置按钮悬停事件
通过函数设置事件回调
创建tooltip
使用 BlzFrameSetTooltip 可以知道本地玩家悬停在项目或命令按钮上。
利用悬停时显示tooltip的方式,检查tooltip的显隐即可
获取内置UI
对于某些frame,暴雪提供了另一种获取帧引用的方法。它们被称为 OriginFrame,它有一个自己的 getter native 和一堆常量。
当没有提到索引时,使用索引 0。但它似乎给了你最后一个正确的索引给出。
ORIGIN_FRAME_WORLD_FRAME
ORIGIN_FRAME_HERO_BAR
ORIGIN_FRAME_HERO_BUTTON
ORIGIN_FRAME_HERO_HP_BAR
ORIGIN_FRAME_HERO_BUTTON_INDICATOR
ORIGIN_FRAME_MINIMAP_BUTTON
ORIGIN_FRAME_ITEM_BUTTON
ORIGIN_FRAME_COMMAND_BUTTON
ORIGIN_FRAME_PORTRAIT
ORIGIN_FRAME_PORTRAIT_HP_TEXT
ORIGIN_FRAME_PORTRAIT_MANA_TEXT
ORIGIN_FRAME_UNIT_PANEL_BUFF_BAR_LABEL
ORIGIN_FRAME_UNIT_PANEL_BUFF_BAR
ORIGIN_FRAME_UNIT_MSG
ORIGIN_FRAME_TOP_MSG
ORIGIN_FRAME_SYSTEM_BUTTON
ORIGIN_FRAME_SIMPLE_UI_PARENT、ORIGIN_FRAME_PORTRAIT_HP_TEXT、ORIGIN_FRAME_UNIT_PANEL_BUFF_BAR、ORIGIN_FRAME_UNIT_PANEL_BUFF_BAR_LABEL 未包含在 1.31.1 的初始版本中它们是在 1.32.2 中添加的
隐藏默认用户界面
操作
全部隐藏
基础
如果您不需要任何此内置框架,则可以使用BlzHideOriginFrames(true)它隐藏除命令按钮、聊天、消息、TimerDialogs、Multiboards 和 LeaderBoards 之外的所有内容。
注意
重制版
用完之后,BlzHideOriginFrames(true)底部还有一个黑框。 这就是 ConsoleUI 底部的背景。
仅隐藏底部 UI
基础
还有一些其他选项可以“隐藏”部分 UI。一种是将“ConsoleUI”的底部移低一点,这必须在地图初始化时完成,稍后再做会导致崩溃。
注意
当计划移动一些originframes时,也建议使用这行代码BlzEnableUIAutoPosition(false)。
当用户更改分辨率或 windowMode 时,这将停止某些内置帧的重新定位。
通过游戏界面替代隐藏 UI
基础
如果只是想摆脱视觉背景,则更改 UI 使用的纹理会产生更少的副作用。
通过将游戏界面中使用的纹理设置为 UI\Widgets\EscMenu\Human\blank-background.blp,它就消失了。
或者在地图的文件war3mapSkin.txt(基本相同,但不使用世界编辑器)
移动默认 UI
基础
当它提到一个框架被锚定的东西比这意味着你可以通过将这个点放在其他地方来移动框架。或者你先使用 BlzFrameClearAllPoints 然后将它放置到想要的位置。
操作
ORIGIN_FRAME_WORLD_FRAME
可以设置世界的点,使可玩部分更小。
遗憾的是,左右限制无法正常工作,仍然可以订购世界以外的单位,
但显示受到限制。
ORIGIN_FRAME_HERO_BAR
由游戏重新定位,而 BlzHideOriginFrames(false)
锚定与 TopLeft
触摸它也重新定位英雄按钮
ORIGIN_FRAME_HERO_BUTTON
要移动它,您需要使用 TopLeft 锚定的 BlzHideOriginFrames(true) 或 BlzEnableUIAutoPosition(false)
ORIGIN_FRAME_HERO_HP_BAR
ORIGIN_FRAME_ITEM_BUTTON
Warcraft 3 V1.32+ 你需要使用名称 Version 来移动它
ORIGIN_FRAME_COMMAND_BUTTON
Warcraft 3 V1.32+ 你需要使用名称 Version 来移动它
ORIGIN_FRAME_SYSTEM_BUTTON
它们与其名称版本相同。
ORIGIN_FRAME_PORTRAIT
大小随分辨率而变化 锚定于 左下角 要移动它,您需要 BlzHideOriginFrames(true) 或 BlzEnableUIAutoPosition(false)
ORIGIN_FRAME_MINIMAP
在 V1.31.1 中,鼠标在小地图上的点击会被破坏,因为游戏会将点击解释为相对于默认小地图位置。
ORIGIN_FRAME_MINIMAP_BUTTON
ORIGIN_FRAME_UBERTOOLTIP工具提示框
大多数默认 UI 的ORIGIN_FRAME_UBERTOOLTIP工具提示框。 与 BottomRight 锚定。 当它向上扩展时,我建议用一个底点移动它。
组选择
只能使用 Frame Child api (V1.32.6+) 访问此 Frame。 它锚定到“SimpleInfoPanelUnitDetail”的父级,0。
移动 groupSelection 的单个按钮:
排行榜
注意
不建议直接移动任何“SimpleInfoPanelIcon”,因为游戏会根据当前需要重新放置它们。
移动单个UnitInfoPanels,最好通过移动“InfoPanelIconBackdrop”来完成
简单的 UI 更改
操作
隐藏整个游戏的 Hero-Exps 工具提示
隐藏英雄属性
禁用 UpKeep-Tooltip(魔兽争霸 3 V1.32.6+)
使电影消息中心对齐
通过占用 Quest-Defeat-Condition 保留空间来扩展 Quest-Description 的空间
隐藏 BuffBar,因为 BuffBar 通过选择重新显示,简单的 BlzFrameSetVisible false 不会这样做。相反,创建一个隐藏的父级并更改父级:
创建UI
基础
BlzCreateFrame&BlzCreateSimpleFrame用于创建在 FDF 中定义的 MainFrames(块之外的那些),必须使用 TOC 加载到游戏中。
基础
BlzCreateFrame创建不是 SimpleFrames 的 MainFrames。大多数框架允许附加各种框架事件,它们可以做很多事情。
BlzCreateSimpleFrame创建 Simple 组的 MainFrames。SimpleFrames 的类型名称中有“SIMPLE”。大多数 Simpleframes 不能在其上注册 frameevents
参数
framehandle owner
对一些已经存在的 Frame 的引用,它成为新框架的父级。
一个 SimpleFrame 想要一个 SimpleFrame 而一个 Frame 想要一个 Frame,混合它们往往会失败或破坏 Child-Parent 的某些功能。
integer priority
应该是自然数(大于等于 0)。
integer createContext
框架中的索引存储新框架及其子框架将占用。使用 BlzGetFrameByName("name", createContext) 访问帧存储
即id
BlzCreateFrameByType定义一个新的 Frame 并在同一个调用中创建它。
基础
参数
string typeName
frame类型
string name
这是新框架的名称。
string inherits
要使用的模板样式
可以为空
类似于 fdf 中的 INHERITS
操作
不使用fdf文件创建
操作
背景
没有 FDF 的背景
https://www.hiveworkshop.com/threads/the-big-ui-frame-tutorial.335296/#FrameExampleImageNoFdf
文本
没有 FDF 的文本
没有自定义 FDF 的 EDITBOX
在 Templates.toc 中加载一个之后,可以创建一个 EditBox。尽管无法更改编辑框中的文本大小。
在 QuestDialog 中创建一个文本区域
在本例中,我将向您展示如何创建一个 Textarea 作为 QuestDialog 的子项。
此示例需要加载 Templates.toc 中包含的 ui\framedef\ui\escmenutemplates.fdf 以创建 TEXTAREA。整个事情都可以使用 BACKDROP 来消除要求。
按钮
没有 FDF 的文本按钮
可以使用“DebugButton”而不是“ScriptDialogButton”创建一个蓝色按钮。
带有 AutoCast 模型的 TextButton 没有 FDF
此示例在屏幕中心创建一个 ScriptDialogButton,并在其上方/周围放置一个动画 AutoCast 模型 (SPRITE)。
没有自定义 FDF 的 IconButton
另一个常见的事情是创建一个由命令按钮图标表示的按钮。这里创建了 2 frame,一个按钮是可点击的部分,一个背景是显示图标。
还有另一个加载的继承选项“IconButtonTemplate”(蓝灯)。
ScritpDialogButton 2 图标按钮
这是魔兽争霸 3 V1.32.6+ 创建图标按钮的示例,单击该图标按钮会变小。该示例没有使用自定义 fdf 代码,也没有使用调整大小的 onclick 代码。Lua 代码在《魔兽争霸 3》中开箱即用 ScriptDialogButton 有 4 个背景,每个状态一个:Default、Pushed、Disabled、PushedDisabled。使用子 api 可以访问它们更改纹理并重新设置推送状态(在按住时具有收缩效果)。
与上面类似的代码,但不使用内部frame,因此需要加载 EscMenuTemplates fdf 并在 V1.31 中工作
模型
Sprite RockBoltMissile 没有 FDF
如何使用 Frame-SPRITE 在 UI 框架内使用世界模型。
SPRITE Frame-Type 是可以显示模型的 UI 框架之一,其他是 MODEL 和 STATUSBAR。
滑块
没有自定义 FDF 的滑块
具有值更改事件的垂直滑块。在事件内部,它将新选择的值显示为消息。这是开箱即用的。
右侧带有文本框的水平滑块显示当前值。当鼠标指向滑块时,滚动鼠标滚轮会导致值发生变化,这需要在运行此 Lua 代码的地图中使用 EscMenuTemplates.fdf 导入 Templates.toc。
复选框
没有 FDF 的复选框
因为有一个默认加载的复选框,只要知道名称,就可以使用该复选框创建复选框,而无需打扰 toc 或 fdf。 可能的有“QuestCheckBox”、“QuestCheckBox2”、“QuestCheckBox3”。它们都使用 EscMenu 纹理,但大小不同。尽管这无关紧要,但可以使用 此 Lua 代码直接更改大小,并将在屏幕中央创建一个小复选框。
还有 2 个其他复选框可以使用。
“ScoreScreenBottomCheckButtonTemplate”只是一个鼠标悬停高亮和一个选中的纹理,两者都是黄灯。默认加载。可以与 aa BACKDROP 一起使用。
并且默认情况下没有加载“EscMenuRadioButtonTemplate”,在使用之前必须将 UI\FrameDef\UI\escmenutemplates.fdf 加载到游戏中。
进度条
没有 FDF 的 ModelBar
这个例子展示了如何在没有任何 fdf 的情况下使用“STATUSBAR”来显示条形模型。
据说“STATUSBAR”只支持1s动画,1s后的sequzenzes被丢弃。
TriggerHappy 遇到了一种情况,即使用与 STATUSBAR 相同模型的单位受到 Bar 当前动画的影响。
2层进度条
可以在同一位置创建并放置 2 个 SIMPLESTATUSBAR,并使用不同的纹理来显示进度/冷却时间等。
要更改当前进度,可以在 ForeGround 上使用 BlzFrameSetValue 以从左侧显示 Value%,从右侧显示 100-value% 的背景。
没有 FDF 的statusBar
可以使用更适合酒吧的纹理来代替牧师图标,例如 xp-Bar 中的纹理。 因为它是灰色纹理,所以可以用 2 个本地人(Warcraft3 V1.31 中的崩溃)对其 进行着色,而不是这样的着色,可以使用 teamcolor 纹理来轻松简单的单色条。
有时需要玩家使用的 colorTexture,这可以通过一些简单的字符串工作来完成。
选项卡
此示例在没有任何自定义 fdf 的情况下完成,但需要加载 escmenutemplates.fdf。它还显示了糟糕的 UI 框架代码最终会如何。
展示了一种创建硬编码可隐藏框的方法,其中包含 3 个页面,每个页面具有不同的内容。通过单击底部的页面按钮更改页面。
https://www.hiveworkshop.com/threads/the-big-ui-frame-tutorial.335296/#FrameExampleImageNoFdf
ToolTips
基础
示例
让我们创建一个带有 TEXT Tooltip 的 TextButton。这在没有任何自定义 Toc 或自定义 fdf 的情况下开箱即用。
最后一个示例有效,但 Box 中的文本会更好。
这是通过创建一个 BACKDROP the Box 和一个 TEXT Frame 作为 Box 的子级来完成的。Box 成为工具提示,因为 Child 文本将共享它的 Parent 框的可见性。
对于 BACKDROP,我们使用“QuestButtonBaseTemplate”。
动态适应大小
前面的例子没问题,但是有一点很麻烦,必须设置盒子的大小。当盒子适合文本时会更好。
可以这样做,而不是使文本适合框,而是使框扩展到文本的位置。
游戏甚至支持使用 0 作为 TEXT-Frame 的高度来处理多行。
但是现在必须注意框是相对于文本的,这意味着必须将文本放置在框的附加大小上。
simpleFrame工具提示
SimpleFrameTooltip 的工作示例。它基于来自 fdf 的蓝图和代码驱动的“SIMPLESTATUSBAR”创建一个“SIMPLEBUTTON”。
“SIMPLESTATUSBAR”用作图标和工具提示。
操作
判断toolTips面板是否显示
BlzFrameIsVisible(frame)
BlzFrameIsVisible(frame) 还为用作工具提示的帧返回正确的值,这是异步的,因此速度很快但也很危险。
它可以用于执行无enter/Leaver事件(发送网络包)的iFrame悬停。
使用 Tooltips + Check Visibility (Async) 或 Enter/Leave Events (Sync) 可以知道哪个 Frame 悬停在 Frame API 上。
撤消工具提示状态的问题更大。可以创建一个新的 FRAME/SIMPLEFRAME 作为替换,但这仍然不会使旧的 Tooltip 再次成为普通(简单)Frame。这样的
多面板
基础
操作
创建多个多面板
基础
当第一次显示多板时,它们将采用 createcontext 0,在创建多板时发生的 GUI 中。此外,更多的多板也将使用 createcontext 0。
这意味着在创建另一个多板 (GUI) 之前,必须将框架保存在变量中。
必须这样做,因为显示另一个多板将隐藏先前显示的一个并覆盖我们使用 BlzGetFrameByName 加载的frame存储。
示例
在此示例中,创建了 3 个多面板,这 3 个位于其他位置。
这就是它应该看起来的样子。仅在 4:3 分辨率下。在 16:9 中,它们是一个楼梯。
fdf
frame事件
基础
事件类型
这是在 1.31.1 中完成的有关 Frame-Events 和 Frame-Levels 的测试结果。
FRAMEEVENT_CONTROL_CLICK
当通过释放鼠标左键(原始鼠标单击必须在 Button 内)或当 Frame 具有焦点和空格或按下 Enter/Return 来激活 Frame 时。
在 fdf ControlStyle "CLICKONMOUSEDOWN" 中,让这个事件在鼠标点击而不是释放时发生。
此事件发生在 FRAMEEVENT_MOUSE_UP 之前。
FRAMEEVENT_MOUSE_ENTER
鼠标光标进入帧
FRAMEEVENT_MOUSE_LEAVE
鼠标光标离开帧
FRAMEEVENT_MOUSE_UP
当释放鼠标左键、右键或滚轮时,鼠标光标当前位于帧内
FRAMEEVENT_MOUSE_DOWN
什么都不做或没有框架接受它。
FRAMEEVENT_MOUSE_WHEEL
当鼠标悬停在框架上并且滚轮滚动时发生。
可以通过检查 BlzGetTriggerFrameValue 在 Event 中检测滚动的方向
+120 -> 前进
-120 -> 后退
FRAMEEVENT_CHECKBOX_CHECKED
选中未选中的复选框
FRAMEEVENT_CHECKBOX_UNCHECKED
- 取消选中选中的复选框
FRAMEEVENT_EDITBOX_TEXT_CHANGED
- 删除或添加文本。
按用户或代码。
FRAMEEVENT_POPUPMENU_ITEM_CHANGED
- 用户在弹出菜单中选择了一个选项 BlzGetTriggerFrameValue 告诉您哪个索引。
FRAMEEVENT_MOUSE_DOUBLECLICK
- 什么都不做或没有框架接受它。
FRAMEEVENT_SPRITE_ANIM_UPDATE
- ?
FRAMEEVENT_SLIDER_VALUE_CHANGED
- 更改滑块或滚动条的值时。
FRAMEEVENT_DIALOG_CANCEL
- 当激活对话框的取消按钮时
FRAMEEVENT_DIALOG_ACCEPT
- 当激活对话框的接受按钮时
FRAMEEVENT_EDITBOX_ENTER
- 当框架有焦点时按回车键。
FrameEvent 获取器
操作
frame类型及其可以使用的事件
frame类型
可以触发的事件
BACKDROP
None
BUTTON
CONTROL_CLICK
MOUSE_ENTER
MOUSE_LEAVE
MOUSE_UP
MOUSE_WHEEL
CHATDISPLAY
MOUSE_ENTER
MOUSE_LEAVE
MOUSE_UP
MOUSE_WHEEL (CONTROL_CLICK with BlzFrameClick)
CHECKBOX
MOUSE_ENTER
MOUSE_LEAVE
MOUSE_UP
MOUSE_WHEEL
CHECKBOX_CHECKED
CHECKBOX_UNCHECKED (CONTROL_CLICK with BlzFrameClick)
CONTROL
MOUSE_ENTER
MOUSE_LEAVE
MOUSE_UP
DIALOG
DIALOG_CANCEL
DIALOG_ACCEPT
EDITBOX
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
EDITBOX_TEXT_CHANGED, EDITBOX_ENTER (CONTROL_CLICK with BlzFrameClick)
FRAME
None, (阻止先前创建的 0 级frame)
Glue
GLUEBUTTON
CONTROL_CLICK, MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
GLUECHECKBOX
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
CHECKBOX_CHECKED, CHECKBOX_UNCHECKED (CONTROL_CLICK with BlzFrameClick)
GLUEEDITBOX
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
EDITBOX_TEXT_CHANGED, EDITBOX_ENTER (CONTROL_CLICK with BlzFrameClick)
GLUEPOPUPMENU
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_WHEEL
CONTROL_CLICK
POPUPMENU_ITEM_CHANGED
GLUETEXTBUTTON
CONTROL_CLICK, MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
HIGHLIGHT
None
LISTBOX
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
MENU
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
MODEL
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL (CONTROL_CLICK with BlzFrameClick)
(仅在占用的屏幕空间中,这与视觉部分无关)
POPUPMENU
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_WHEEL, CONTROL_CLICK
POPUPMENU_ITEM_CHANGED
SCROLLBAR
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
SLIDER_VALUE_CHANGED
SLIDER
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
SLIDER_VALUE_CHANGED (CONTROL_CLICK with BlzFrameClick)
simple
SIMPLEBUTTON
CONTROL_CLICK
SIMPLECHECKBOX
None
SIMPLEFRAME
None
SIMPLESTATUSBAR
None
SLASHCHATBOX(斜线聊天框)
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
EDITBOX_TEXT_CHANGED
EDITBOX_ENTER (CONTROL_CLICK with BlzFrameClick)
SPRITE
None
Text
TEXT
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
CONTROL_CLICK
TEXTAREA
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
TEXTBUTTON
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
CONTROL_CLICK
TIMERTEXT
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL
CONTROL_CLICK
frame和多人游戏
基础
多人游戏同步原理
魔兽争霸 3 为其网络功能使用了一种称为锁步协议的技术变体。
这是一种仅共享最少数据的技术,仅共享所需的数据,例如用户输入和一些同步测试,以了解玩家仍在玩同一个游戏。
在共享输入之外,每个用户的机器都自己模拟游戏。
使用这意味着您可以只为一个用户使用 Frame 执行任何操作,只要使用该 Frame 的结果对所有玩家保持相同(只要结果完全影响魔兽争霸 3 游戏模拟)。
应该相同的最低限度是框架的存在和事件。
即只同步操作,不同步数据
意味着人们可以在 GetLocalPlayer 中为帧做几乎所有事情(位置、大小可见性、纹理、颜色、文本......),但这是玩火,当使用错误时,你的帧会发生许多同步丢失。
因此,这些本地函数的结果并不保证对所有玩家返回相同的结果:
操作
输入和当前状态
处理用户输入的frame不会同步它们的状态/显示数据。
用户输入仅对执行该输入的玩家的frame产生影响。
当显示一个复选框并且用户 A 单击它时,只有用户 A 的复选框才会处于选中状态。
这也适用于编辑框和滑块。
因此使用 BlzFrameGetText(Editbox) 或 BlzFrameGetValue(Slider) 可能会产生断开连接,因为它们的值是本地的并且不同。
当使用一个本地变量接受这些函数的返回值时,不同玩家端中这个变量的值会不一样
如何避免这种问题
答案是使用frameEvents
当触发事件时新状态/值与所有玩家共享
当需要该值时,将其保存到事件触发器内的变量中,以便所有玩家现在都知道它(尽管他们不会在该帧的实例中显示它)。
现在将存储值用于所有玩家必须发生的所需行为。
如何只使用一个frame为不同的玩家显示不同的东西,而不会发生不同步
基础
1||| 一种方法是将显示和数据分开。所有玩家的数据都存在,但框架上显示的数据不同。
基础
假设一个人将 Goldcosts 保存在 playerIndex 的数组中。
缺点
如果有两个玩家将同一个frame设置到不同的位置,那么使用获取位置函数获得的值将不一样.此时将结果赋值给一个变量,将造成这个变量的值不同步
2||| 另一种方法是将所有数据保存在本地,一旦发生改变游戏模拟的事情,就会使用所有需要的数据启动一个共享事件。
基础
BlzSendSyncData 可能是一个可能的候选人。
这需要很好地理解和关心什么会改变游戏以及如何将所有内容转储到一个小的同步消息中。
这是在玩火,需要知道什么会改变游戏模拟。
缺点
很难控制,需要手动进行同步
3||| 可以为每个玩家创建一个 Frame,而不是只使用一个 Frame。
基础
这需要最少使用 GetLocalPlayer 和知识。
每个人都只看到自己的 Frame,但仍然执行其他人所做的所有操作。
如果不想创建 Frame-Variables,CreateContext (即使用id区分frame)在这里是一个很大的帮助。
缺点
性能低,每个客户端不仅保存所有数据,还要创建所有frame并执行其操作
示例
当玩家选择一个单位时,iconButton 将显示所选单位的图标,当单击按钮时,将为单击的玩家创建此类型的单位。(该按钮应该同时适用于所有玩家。)
第一种方法
第二种方法
第三种方法
frame保存和加载
基础
可悲的是,魔兽争霸 3 中存在一个危险的框架错误,可能会导致游戏崩溃。
当自定义地图创建自定义 UI 框架并使用魔兽争霸 3 保存保存和加载地图时,可能会发生此错误。
加载后,所有此类自定义创建的框架都会损坏、隐藏且无法使用。
如果您使用这种损坏的框架,游戏可能会崩溃。
这适用于从版本 1.31 到具有自定义 UI 的第一个版本到 1.32.9 PTR(我写这篇文章的时间)。
可以通过禁用保存/加载或在加载时重新创建所有自定义框架来解决该错误。虽然这听起来很难做到,但对于静态帧来说非常简单。
基本上只需将所有 Frame 创建函数放入一个数组中,并在加载地图时再次运行该东西。
示例
这将是这样一个系统,可以在其中注册 Framecreation 函数
还有一个使用它的例子。
toc fdf
toc
基础
在游戏中加载一个 TOC 文件
注意
一张地图可以加载任意数量的 TOC 文件
仅重制版:当 2 个 TOC 加载同名的 Frame 时,较新的将覆盖旧的。
TOC 以一两个空行结尾取决于用于该文件的行尾序列。
如果是“CRLF”,则至少需要 1 个空行。
如果是“LF”,则至少需要 2 个空行。(GetLocalPlayer)
当加载包含其他 fdf 的 fdf 时,TOC 中 fdf 的顺序很重要,并且这些 fdf 加载在同一个 TOC 文件中。
fdf
基础
Blizzard 的 fdf 在以下位置的 casc 中找到: ui/framedef/ui/ ui/framedef/glue/ _locales/dede.w3mod:ui/framedef _locals 中的那些包含该语言的本地化字符串。
胶水(glue)有魔兽争霸3 V1.32之前的老游戏菜单的框架蓝图。 UI 包含在比赛期间很重要的框架蓝图。
注意
一个 fdf 中的 MainFrames 的名称必须是唯一的。如果在当前 fdf 中遇到另一个具有相同名称的 MainFrame,则跳过剩余的文件内容。
ChildFrames 可以与他们的兄弟、他们的父母同名或为空“”。
如果在 fdf 中写入错误,则跳过当前文件的剩余文本,此时仍将创建发生错误的 Frame。
操作
语法错误
最新版本的魔兽争霸 3 告诉您自定义 fdf 的语法错误。当它们通过地图中的 toc 文件加载时。
要检查此类错误日志,请使用 fdf 和 toc 运行您的地图,然后关闭游戏并检查 Users\User\Documents\Warcraft III\Logs\War3Log.txt。
该日志文件中的此类 Fdf-error 行可能如下所示:
可悲的是,它似乎只告诉您第一次遇到的错误,并且如果目录没有所需的空结束行,则不会告诉您任何错误。
语法
关键字
IncludeFile
基础
可以在一个 fdf 中使用多个 IncludeFile 操作。
格式
参数
Width
基础
此框架的初始宽度。
格式
Height
格式
块
Frame
语法
关键字
INHERITS
从另一个 Frame 复制 Fdf Actions
INHERITS WITHCHILDREN
复制了 Child-Frames 并使用他们的 fdf-Actions
格式
使用“FrameName”定义一个“FRAMETYPE”的新框架,在 Foramt2 中它将从继承的框架中克隆大多数 fdf 动作。 WithChildren 还将为子框架克隆 fdfActions。
FrameName 可以为空“”,但它必须存在。
FrameType
基础
GLUE 版本倾向于在点击时发送音频反馈(使用 BlzCreateFrame 创建时)
SLASHCHATBOX、EDITBOX、GLUEEDITBOX 有点相同。
通用参数
ControlBackdrop
基础
设置背景控件
格式
示例
ControlDisabledBackdrop
基础
与ControlBackdrop类似,但适用于禁用的frame。 可以跳过,然后ControlBackdrop将作为禁用状态下的背景使用。
格式
示例
SetPoint
基础
设置相对位置
SetPoint可以看作BlzFrameSetPoint(self, FramePoint-Own, BlzGetFrameByName(FrameName, 0), FramePoint-FrameName, x, y)
使用 UseActiveContext,Frame 将使用与创建当前 Frame 相同的 CreateContext 连接到相关 Frame。
即查找与创建Frame时传入的CreateContext相同的值来查找父窗口
格式
示例
与 DzFrameSetPoint() 函数相同
参数
[0:左上|1:上|2:右上|3:左|4:中|5:右|6:左下|7:下|8:右下]
SetAllPoints
基础
将frame的所有锚点设置到父窗口的对应锚点位置
即子窗口完全跟随父窗口的大小
UseActiveContext
基础
在使用它的 Frame 中改变 SetPoint(在 fdf 中)的行为,不使用 BlzGetFrameByName(name, 0) 它将调用 BlzGetFrameByName(name, createContext)。
即将根据父窗体创建时设置的id来选择父窗体,而不是使用默认的0号id
格式
示例
这是一个没有 UseActiveContext 的示例 fdf-Frame。
即使使用不为 0 的 CreateContext(id) 创建时,框架也应将自身附加到 ("ConsoleUI", 0)
DecorateFileNames
基础
在这个frame中,所有请求 FilePaths 的 FdfAction 都将使用 variableNames,而不是从 StringList 或一些 Txt-File (如 GameInterface)中获取。
即使用变量名替换文件路径
格式
不带参数,作为标记使用
示例
LayerStyle
基础
设置frame的属性
格式
同时设定多个参数
参数
IGNORETRACKEVENTS
不触发 Frame Mouse 事件并且不能被点击。 TEXT 和 FRAME 可能会很好地用于此。
NOSHADING
无阴影
Alpha
基础
“调用” BlzFrameSetAlpha(this, value),使框架“透明”或更稳定
格式
ToolTip
基础
创建此框架时,它“调用” BlzFrameSetTooltip(this, BlzGetFrameByName(frameName, createdContext))
格式
示例
DoNotRegisterName
基础
此 Frame 不添加到 BlzGetFrameByName 访问的存储中
格式
分类
Backdrop
BACKDROP
基础
管理框架组的视觉纹理,它们是边框、背景或图像(对于非简单框架)
可以通过代码改变纹理。
DzFrameSetTexture
参数
BackdropBackground
基础
定义背景/主纹理。
格式
BackdropBackgroundSize
在平铺模式下,每个平铺的大小
BackdropBlendAll
启用透明通道
BackdropCornerFlags
设置边框
顺序可以打乱
BackdropCornerFile
设置边角贴图
BackdropCornerSize
边角大小
BackdropBackgroundInsets(背景插图)
基础
可以控制边距
格式
设置背景图像的边距
示例
BackdropEdgeFile
基础
设置所有边框贴图
为该 BACKDROP 设置 BorderFile,该文件包含边框的所有部分作为彼此相邻的片段。
注意
使用 BlzFrameSetTexture 将删除 BackdropEdgeFile 设置。
BackdropTopFile
设置顶部边框贴图
BackdropLeftFile
设置左侧边框贴图
BackdropRightFile
设置右侧边框贴图
BackdropBottomFile
设置边框底部的纹理
BackdropHalfSides
BackdropMirrored
镜像显示背景背景。 左右 <->。 通过代码进行纹理交换。
BackdropTileBackground
背景平铺
用纹理实例填充 Frame。 没有背景文件被拉伸。 使用此功能时还应设置 BackdropBackgroundSize。
示例
来自“UI/FrameDef/UI/EscMenuTemplates.fdf”的示例
自定义示例
(Glue)(Text)Button
基础
按下可以发送音频反馈(使用 BlzCreateFrame 创建的 GLUE),并且可以使用允许执行代码的 TriggerEvent 捕捉按下。
分类
BUTTON
GLUEBUTTON
示例
获取childFrame
GLUETEXTBUTTON
示例
LISTBUTTON (TODO)
TEXTBUTTON
参数
ControlShortcutKey
基础
使用热键
这是通过为按钮提供一个具有 fdfAction 的父框架TabFocusPush,以及创建一个带有所需热键的 StringList 来完成的。
然后创建 Buttons 作为 Frame 的子元素
示例
加载 fdf/toc 的 Lua 代码创建框架、触发器和事件以监听按钮点击。
注意
由于某些奇怪的原因,热键不能开箱即用(为 GAMEUI 创建时),必须执行一次隐藏和显示父框架。
然后热键将在单击时侦听并启动事件。
热键将触发一个控制单击事件,与通过鼠标单击启动事件时不同,该事件不会保持键盘焦点。
示例
Hotkeys
Checkbox
分类
CHECKBOX
GLUECHECKBOX
示例
暴雪的示例复选框:
参数
CheckBoxCheckHighlight
设置复选框高亮控件(即√对号),选中并启用复选框时显示。
CheckBoxDisabledCheckHighlight
设置复选框高亮控件(即√对号),选中并禁用复选框时显示。
RadioGroup
基础
RadioGroup 将复选框与 ControlStyle "EXCLUSIVE(唯一的)" 一起绑定到一个组中,可以确保只选择其中一个。每个玩家可以有不同的选择。
操作
示例
复选框 RadioGroup 的示例
参数
分类
RADIOGROUP (TODO)
Dialog - Yes/No
DIALOG
参数
DialogBackdrop
背景
DialogOkButton
用于对话框的GLUETEXTBUTTON用作ok。 GLUETEXTBUTTON必须是对话框的直接子级。
DialogCancelButton
同上
示例
fdf文件
创建
EditBox - Textinput
基础
编辑框是可由玩家编辑的单行文本框。
默认 fdfs 中有 4 个预定义的大型机编辑框,但其中 2 个基本上“等于”另一个。
编辑框处理文本输入有 2 个事件:
FRAMEEVENT_EDITBOX_TEXT_CHANGED
基础
对于本地播放器,编辑框的文本何时更改。 通过播放器或代码添加/删除文本时发生(每个玩家都会触发这个事件)。
操作
BlzGetTriggerFrameText
在同步此文本的事件期间,一个用于BlzGetTriggerFrameText获取文本在其框中的文本。
长度不会超过 255。
FRAMEEVENT_EDITBOX_ENTER
BlzFrameGetText
为每个玩家返回他当前在编辑框中的文本 -> 在多人游戏中不同步。
因此,必须使用 frameevents 来同步它。
分类
EDITBOX
GLUEEDITBOX
SLASHCHATBOX
参数
EditBorderSize
将文本从边框偏移该数量
EditCursorColor
定义编辑框光标 "|" 的颜色,当其具有焦点时。
EditText
初始化文本
EditTextColor
定义编辑框文本的颜色。
EditTextFrame
设置编辑框文本的样式。需要"Text" frame。出于某些原因,EditTextFrame对光标没有影响。编辑框本身可以有一个FrameFont来更改光标的字体。
EditTextOffset
偏移编辑框中的文本,此文本不能超出编辑框。 超出部分将变为“隐藏”。
FrameFont
直接在 EditBox 中的 FrameFont 定义了光标的字体(大小)。
EditHighlightColor
EditBox 的标记文本框的颜色。 Alpha 不应为 1.0,因为它会使标记的文本不可读。 可以跳过 alpha 值,然后它是 1.0。
EditHighlightInitial
初始文本被标记。 Cursor FontSize 和 Text FontSize 应该匹配,否则只有初始文本的一部分被标记。
EditMaxChars
不能在 EditBox 中写入超过该数量的字符。 占用超过一个字节的字符占用多个插槽。 例如 11 可以是 1234567890A 或 ÄÄÄÄÄÄA 因为 Ä 占用 2 个字节。 将文本粘贴到更长的文本中被拒绝。 需要超过 1 个字节的字符
EditSetFocus
在创建此 Frame 时为其提供焦点。 以这种方式给出的焦点非常强点击地面不会转移焦点也不会隐藏它,但是点击另一个自定义 UI 会将它拿走并且焦点变得正常。
示例
它加载自定义 tocFile,创建名称为“EscMenuEditBoxTemplate”的框架并将 2 个事件注册到该框架。 此外,当本地玩家将其键盘焦点放在编辑框上并按下回车键时,其当前插入文本将显示在消息框架中,并且该消息保存在 gui 变量 udg_UserInput[playerIndex] 中。
此触发器将打印本地玩家当前在其编辑框中显示的文本。当前显示的文本可能未同步,如果以同步方式使用,则可以使游戏不同步。(只要不给变量赋值就行)
这是一个具有更大 FontSize 的 EditBox fdf 示例。
操作
限制文本长度
基础
可能想要限制播放器可以放入编辑框中的文本数量,可以通过非常简单的代码设置这样的限制。
操作
BlzFrameSetTextSizeLimit
使用后BlzFrameSetTextSizeLimit(editbox, 10)编辑框只能包含 10 个字符。
BlzFrameGetTextSizeLimit(editbox)
基础
获取文本长度限制
注意
一个编辑框可以包含 4096 个字符,如果超过该数量,它将变得不可见。(KeepVary)
默认情况下,编辑框使用 -256 的 TextSizeLimit,它允许任意数量的输入,但无论允许输入多少,在事件中只有 255 个可用。
ListBox
分类
LISTBOX
LISTBOXITEM (TODO)
示例
似乎(在 1.32.6 中)框架 api 缺少使用 LISTBOX 的事件,这使得它有点弱。但无论如何,这里是一个如何使用 fdf + Lua 创建 ListBox 的示例。
Frame
FRAME
基础
FRAME 争夺屏幕空间的鼠标控制权
他们不能有功能性子框架。使它们成为虚拟框架和逻辑容器的良好用途。
可以提供和使用 FRAME a(s) Tooltip。
即作为空物体使用
不能设置属性
参数
TabFocusPush
基础
为childFrame启用ControlShortcutkey属性
使用热键
示例
示例
Highlight
基础
Highlight 仅用作功能性子框架。
在魔兽争霸 3 V1.31 和 1.32 中,无法在游戏期间更改使用的纹理。
在游戏过程中更改高光的父级可能会导致它有时过度发光。
分类
HIGHLIGHT
参数
HighlightAlphaFile
设置该 Highlight 正在使用的文件
HighlightAlphaMode
更改突出显示与下面的框架交互的方式。 暴雪复选框使用“BLEND”。
HighlightType
贴图
有阴影
HighlightColor
与 HighlightType "SHADE" 一起出现,设置阴影颜色
示例
Popupmenu
基础
弹出菜单是一个按钮,当它在其下方单击时会出现可选选项
可选择的选项只能在 fdf 中设置(魔兽争霸 3 版本 1.31 和 1.32)。
分类
POPUPMENU
GLUEPOPUPMENU
操作
函数
BlzFrameGetValue
从 0 开始,也可以在未选择任何内容时返回 -1。
BlzFrameSetValue
设置选定的值,但这不会触发 FRAMEEVENT_POPUPMENU_ITEM_CHANGED 事件。
事件
FRAMEEVENT_POPUPMENU_ITEM_CHANGED
注意
在魔兽争霸 3 V1.31.x 中,当“POPUPMENU”放置在 4:3 屏幕之外时,“POPUPMENU”的菜单会中断。
示例
这是创建 PopupMenu 和多个编辑框的 Lua 代码。
参数
PopupArrowFrame
设置下拉按钮(一般是右侧箭头)
PopupButtonInset
设置边距
PopupMenuFrame
设置下拉菜单的frame
PopupTitleFrame
设置菜单标题控件,为 PopupMenu 选择一个 GLUETEXTBUTTON
Slider
基础
魔兽争霸 3 具有垂直或水平滑块/滚动条。
操作
函数
无事件 API
BlzFrameSetValue
基础
将运行此代码的任何播放器的当前值设置为 value,它不超出 Slider 的 Min,Max。
这将为每个运行它的玩家触发一个 FRAMEEVENT_SLIDER_VALUE_CHANGED。
注意
即使调用发生在 GetLocalPlayer 块内,该事件也会由其他玩家触发。
意味着如果您的地图有 8 个用户并且不在 GetLocalPlayer 中运行 BlzFrameSetValue,您将触发该事件 8 次。
BlzFrameGetValue
在 Slider 中返回本地播放器的当前值,因为它是交互式的,所以将其视为危险的异步值。
事件代码 API
事件
FRAMEEVENT_MOUSE_WHEEL
FRAMEEVENT_SLIDER_VALUE_CHANGED。
基础
是当玩家设置或被强制 (BlzFrameSetValue) 到一个值时发生的事件。
这是一个同步事件,它发生在所有玩家身上,其值由 GetTriggerPlayer() 选择。
注意
即使值没有改变,事件也会发生(例如,如果用户将 Button 拖到最大,则该事件很可能连续发生多次)
示例
使 SLIDER 可通过鼠标滚轮滚动的示例代码。这段代码的问题是当用户指向 SLIDER 的按钮时它不起作用。 必须将代码放入带有事件 FRAMEEVENT_MOUSE_WHEEL 的触发器操作/条件中。
分类
SLIDER
参数
SliderInitialValue
初始值
SliderLayoutHorizontal
默认情况下,滑块从左(最小)向右(最大)。
SliderLayoutVertical
Bottom(min) to Top(max)
SliderMaxValue
默认值为100。
SliderMinValue
默认值为0
SliderStepSize
步长
SliderThumbButtonFrame
用于移动滑块/滚动条值的按钮框。
ScrollBarDecButtonFrame
选择一个点击后减少值的按钮
ScrollBarIncButtonFrame
选择一个点击后增加值的按钮
Scrool
SCROLL (TODO)
SCROLLBAR
滚动条更像是一个功能性子功能,而滑块作为一个免费的代码驱动框架更好。 代码 api 非常适合 Slider。滚动条不是这样。
Sprite
基础
SPRITE 是一个非交互式框架,显示魔兽争霸 3 模型并循环播放它的动画。
分类
SPRITE
示例
参数
BackgroundArt
SpriteCamera
应该是将相机的视野渲染到这个sprite上
SpriteScale
缩放使用的模型。 2. 和 3. 数字是假的,似乎没有任何作用。
LayerStyle
无阴影
StatusBar
基础
STATUSBAR 是一个显示魔兽争霸 3 模型的非交互式框架。
与 Sprite 不同,它不会循环动画,但可以使用 BlzFrameSetValue 将当前动画时间设置为动画时间的最小值/最大值的百分比。
即进度条
操作
函数
BlzFrameSetValue
注意
据说“STATUSBAR”只支持1s动画,1s后的sequzenzes被丢弃。
TriggerHappy 遇到了一种情况,即使用与 STATUSBAR 相同模型的单位受到 Bar 当前动画的影响。
分类
STATUSBAR
示例
参数
Text
TEXT
基础
TEXT 是具有多种用途的 Frames 的 FrameType,它在屏幕上显示文本或设置更高级 Frame 的文本样式。
与 SimpleFrames 的 equal String 不同,TEXT 可以有各种 Frameevents,并且会根据它的大小或显示的文本来控制屏幕空间。
操作
函数
BlzFrameSetEnable(frame, false)
通过代码禁用 TEXT-Frame,使其无法接收事件
或添加 fdfaction LayerStyle "IGNORETRACKEVENTS"
LayerStyle 在游戏过程中无法恢复,但 BlzFrameSetEnable 可能会在 TEXT-Frame 为禁用状态设置颜色时改变颜色
BlzFrameSetTextAlignment
基础
设置对齐方式
示例
使用 TOP、CENTER 和 BOTTOM,文本将延伸到两侧,给定点是中心。<|> 使用 TOPLEFT、LEFT 和 BOTTOMLEFT,文本将向右延伸。|> 使用 RIGHT、TOPRIGHT 和 RIGHT,文本将向左延伸。<|
这在 4:3 边框附近有 TEXT-Frame 时可能很重要,当文本扩展到 16:9 区域时,TEXT-Frame 的部分文本不会显示。
字体
基础
《魔兽争霸 3》(重制版 V1.32.2)具有适用于在 war3.w3mod 中找到的所有语言的字体 "Fonts\name"
v1.31.1
注意
在 fdf 中,不使用它们的路径(暴雪,如果你愿意,你可以这样做),而是在 ui\war3skins.txt 中定义的变量。
字体变量 - 默认
(从魔兽争霸 3 版本 1.32 开始) 当使用函数 SkinManagerGetLocalPath 时,该字体也可以在代码中使用。
例如: SkinManagerGetLocalPath("MasterFont") 获取文件路径 "Fonts\BLQ55Web.ttf"
示例
当它用作样式时,它在 fdf 中被定义为功能性子框架。
参数
Text
基础
设置文本
FontColor
FontDisabledColor
FontHighlightColor
FrameFont
框架使用MasterFont时,如果在同一框架中使用DecorateFileNames,则MasterFont有效,否则写入文件路径。
FontShadowColor
文字阴影
FontShadowOffset
这是默认文本的相对偏移量。
FontFlags
基础
FontFlags 改变给定文本的显示。
可以将多个标志与 | 像这样:FontFlags "IGNORECOLORCODES|IGNORENEWLINES",。
在这样的框架上使用 BlzFrameSetText 后,FontFlag 的效果得以保留。
值
文本将仅显示为*
不显示文本颜色
|n & \n 换行符无效
等宽字体(相同数量的水平空间)
不自动换行
固定大小
固定颜色
鼠标移过时高亮
示例
示例 fdf
文本对齐
FontJustificationH
水平对齐方式
FontJustificationV
垂直对齐方式
FontJustificationOffset
偏移
TEXTAREA
基础
TEXTAREA 是一个显示可滚动文本的框架。
Normaly TextAreas 有一个 BACKDROP 显示一个框和一个背景。
TextAreas 需要滚动条。
滚动条位于 TextArea 的右侧,并挡住了 TextArea 的一部分空间。
如果 TextArea 大到足以显示整个文本,则不会显示滚动条。
操作
内置TextArea
BattleNetTextAreaTemplate
UI\Frames\framedef\glue\battlenettemplates.fdf
EscMenuTextAreaTemplate
它们是继承、复制或创建它们的良好基础。
如果要创建其中一个,则必须首先使用 BlzLoadTOCFile 加载它们。
UI\Frames\framedef\ui\escmenutemplates.fdf
创建内置 TextArea
此 jass 代码创建两个 TextAreas,设置位置、大小并用文本填充它们。
为 TEXTAREA 提供足够大的大小以显示滚动条非常重要,否则游戏会在尝试显示 TEXTAREA 时崩溃。
TextArea 的高度应至少为 0.03。
这是相当小的,但如果忘记设置大小而没有默认大小,它将为 0 并且游戏崩溃。
设置 TextArea 的文本
BlzFrameAddText(textArea, newLine)
BlzFrameSetText(textArea, totalText)
屏幕空间和滚动
基础
默认情况下,TextArea 将捕获给它的屏幕空间,使其无法在可玩世界中点击,并将鼠标滚轮发送到其滚动条。
可以禁用 TextArea 以阻止 TextArea 接受鼠标输入,这将使屏幕空间再次可供可玩游戏使用,但这也会禁用鼠标滚轮发送。
当鼠标直接指向滚动条时,仍然可以滚动。
禁用是通过以下方式完成的:
示例
文本区域-FDF
这是一个名为 MyTextArea 的自定义 TEXTAREA,其中有一些注释描述了 fdf 中 TEXTAREA 字段的结果: TEXTAREA 拒绝大多数 TEXT 字体设置,当人们使用 TEXT-Frame 时可能会知道。因此,文本外观不能有太大变化。
从上面创建 MyTextArea 的 jass 代码。
继承的文本区域
要继承 Frame 的 childFrames,需要在 INHERITS 之后添加 WITHCHILDREN。
“BigBnetTextArea”基本上是“BattleNetTextAreaTemplate”,但具有更大的 TextSize 并且线条更大,以更好地适应增加的 textsize。
注意
无法使用 BlzGetFrameByName 访问继承的 childFrame。
随着 V1.32.6 中原生 BlzFrameGetChild 的发布,可以在运行时获取继承的 childFrame,在 1.32.6 中,此原生忽略 String&Texture childFrame。
注意
对于不可滚动的文本,可以简单地使用 TEXT-Frame。
TextArea 可以使用warcraft colorformat |cffff0000 显示彩色文本。
参数
TextAreaScrollBar
示例
TIMERTEXT
Simple
分类
SIMPLEFRAME
基础
SimpleFrames 是另一组帧。它们的类型数量很少,但该组的框架管理着大部分直接的游戏 UI,例如单元信息、能力和项目按钮。
与 Frames 不同,Simpleframes 需要 fdf,如果没有这样的 fdf 首先定义 SimpleFrame,就无法以有用的方式创建。
所有 SimpleFrame 都可以移出 4:3 屏幕。
对于显示的 SimpleFrames 位于 Frames 下方。
操作
示例
参数
Texture
基础
定义一个 Texture-Frame,这仅用于 SimpleFrames。 一个图像。
类似于 frame的BackDrop
格式
示例
注意
如果纹理没有自己的大小,则纹理将复制父级的大小。
当使用 BlzFrameSetTexture 时,AlphaMode 被覆盖。
函数
BlzFrameSetVertexColor
基础
纹理可以在游戏过程中使用本地函数着色
示例
将显示没有蓝色的纹理
当你在大法师纹理上使用这条线时,它会变成黄色,如下图所示
BlzConvertColor
基础
BlzConvertColor takes integer a, integer r, integer g, integer b
注意
注意参数颜色顺序
参数
AlphaMode
DISABLE
忽略 Alpha 通道
BLEND
使用 Alpha 通道
ALPHAKEY
一个 1 位的 alpha,将 alpha 解释为透明或不透明
即没有渐变
ADD
使用 Alpha 通道并避开白色
MOD
忽略 Alpha 通道并放大图像。
TexCoord
基础
理解
就是两个UV纹理坐标,通过这两个坐标来截取图像
left,right就是x的范围
up,bottom就是y的范围
示例
TexCoord 0.0, 0.5, 0.0, 0.5
TexCoord 0, 2, 0, 2
通过将 TOPLEFT 和 TOPRIGHT 放置在相反的位置(Topleft 应该在 Topright 的位置,Topright 应该在 TopLeft 的位置),可以将纹理旋转 180 度。(相当于进行了矩阵变换)
与 String 一样,这是一个如何在屏幕上仅显示一个纹理的示例。一个定义了一个具有宽度和高度的 SIMPLEFRAME 和一个复制模仿 SIMPLEFRAME 的纹理
我们使用 SIMPLEFRAME 加载提及 fdf 的目录并创建 mainFrame“TestTexture”。之后,将孩子的纹理设置为圣骑士的图标,并将 SIMPLEFRAME 定位到屏幕的中心。
String
基础
定义一个字符串frame,这仅用于 SimpleFrames。 一个文本。 更多内容在 SimpleFrames 类别中。
与Text frame功能类似
格式
函数
BlzFrameSetFont
注意
BlzFrameSetFont 仅适用于 String-SimpleFrame。
BlzFrameSetFont 到 SimpleFrame 上会使游戏崩溃。
示例
一个定义了一个 SIMPLEFRAME,它有一个显示文本的 String 子代。
Lua 代码从上面创建 SIMPLEFRAME 并设置文本。
理论上,字体也可以使用 BlzFrameSetFont 在代码中设置。由于某些奇怪的原因不适用于帧类型“TEXT”(V1.31.1)。
参数
Font
基础
设置字体
示例
fdf 中有两种方法来设置字体,一种是添加DecorateFileNames,并为 fontFile 使用来自 StringList 的 stringVariable 或记下 fontFile。
InfoPanelTextFont 仅对DecorateFileNames有效,显示字符串需要字体。
如果以这种方式读取字体,则必须将DecorateFileNames写入字符串的父级中。
FontFile 也可以使用文件路径,但没有 DecorateFileNames。该示例不是相同的字体。
注意
使用与初始字体大小相差很大的字体大小的本机字体可能会破坏显示的文本。
Layer
基础
图层是 Simpleframes 的 fdf 功能,可用于设置显示顺序。
在层内只能定义字符串和纹理。暴雪在他们的魔兽争霸 3 的 fdf 中使用了 2 层。
有五个命名层,按照它们的绘制顺序(从后到前):
BACKGROUND
BORDER
ARTWORK
OVERLAY
HIGHLIGHT
示例
注意
在 fdf 内部,可以在 Simpleframes 之外定义此类字符串/纹理以具有继承的基础。但是人们只能在游戏过程中将它们创建为 Simpleframe 的一部分。
String/Texture-Frames 不包含 UseActiveContext/DecorateFileNames,当他们的 Parent 使用它时,它们会使用它。
如果你在String/Texture上使用这些frame 函数,它会导致游戏崩溃
SIMPLEBUTTON
基础
SimpleButton 是交互式的 Simpleframe。它对于 Simpleframe 来说非常强大,即使在被移出 4:3 屏幕时也可以单击它来启动 FRAMEEVENT_CONTROL_CLICK。
每个 SIMPLEBUTTON 只能有一个 FRAMEEVENT_CONTROL_CLICK 事件,当一个人注册另一个(对于同一个 SimpleButton)时,前一个事件将不再触发。
当被点击时,它不会保持焦点(frame按钮会这样做)
函数
BlzFrameSetEnable
可以在按钮上使用 BlzFrameSetEnable 来阻止用户使用该按钮启动事件。
但它仍然会控制屏幕空间,并且工具提示不会再通过(取消)悬停按钮来更新。(frame按钮在被禁用时停止控制屏幕空间,如果他们曾经这样做过)
BlzFrameSetVisible
使用 BlzFrameSetVisible(button, false) 将隐藏按钮及其子按钮,因为它将释放它们占用的屏幕空间。
注意
SIMPLEBUTTON 可以具有功能性子元素,以具有用于不同状态的纹理和用于该状态的不同字符串。
这个函数子元素有点静态,无法通过 BlzGetFrameByName 访问,这使得它们对动态图标按钮有点不利。
当一个人想要一个像按钮这样的菜单(F10)时,没关系。"ui\framedef\ui\upperbuttonbar.fdf" 包含暴雪的用法。
对于 IconButton,最好创建一个带有 Texture Child 的 SIMPLEBUTTON,这样可以在游戏期间更改纹理。
示例
"ui\framedef\ui\upperbuttonbar.fdf"
"ui\framedef\ui\upperbuttonbar.fdf"
在游戏过程中,将使用 BlzCreateSimpleFrame 创建“MySimpleButton” pos 该帧并使用 BlzFrameSetTexture 设置“MySimpleButtonTexture”的纹理
如果想要在按钮悬停时发光,可以将功能性子框架添加到 fdf 内的 SIMPLEBUTTON。示例 Highlight 是在 scorescreen 中看到的黄色发光。
SIMPLECHECKBOX
SIMPLEGRID (TODO)
SIMPLEMESSAGEFRAME (TODO)
SIMPLESTATUSBAR
基础
SIMPLESTATUSBAR 是一个简单的帧,它根据 SIMPLESTATUSBAR 当前值与其最大值的关系(从左到右)部分显示纹理。
函数
BlzFrameSetValue
设置当前值
BlzFrameGetValue
获取本地当前值
BlzFrameSetMinMaxValue
设置栏的最小最大值
BlzFrameSetTexture
可以在 SIMPLESTATUSBAR 上使用,以在游戏期间更改使用的 Bar-Textur。
BlzFrameSetVertexColor
注意
SIMPLESTATUSBAR 不能有任何 Frameevents 并且不会阻止鼠标单击。
示例
SIMPLETOP (TODO)
参数
Anchor
基础
Anchor 是“SetPoint pointA, parent, pointA, x, y”的快捷方式。
示例
将自己的 TOPLEFT 定位到父母 TOPLEFT,偏移量为 0.1 x 和 0.05 y。
注意
Anchor 只能在 Texture/String 中使用,并且每个中只能使用一次
其他
MODEL
BASE (TODO)
CHATDISPLAY
CONTROL
MENU
示例
MENU的Fdf-Action。Menu 强连接到 PopupMenu
参数
MenuBorder
边框大小
MenuItem
向菜单/弹出菜单框架添加可选选项。暴雪FDF中的数字始终为-2。
MenuItemHeight
菜单的一个选项的高度。 使用的字体大小应该适合这个,否则您可能看不到显示的文本。
MenuTextHighlightColor
菜单文本高亮颜色
MESSAGE (TODO)
Texture
String
Layer
StringList
基础
语法
示例
示例
此 fdf 内容将定义 4 个frame和 4 个本地化字符串(MYLABEL、MYVALUE、MYNAME 和 MyMultLineText)。
在这 4 个frame中,只有 2 个可以创建/继承,即 MainFrames“ButtonTemplate”和“FrameNameA”。