在《魔兽世界》中使用 Interface Options 插件的代码存在问题
2014-12-24 22:44:55
收藏:0
阅读:304
评论:1
我正在为一个现有的插件编写UI。或者更具体地说,我正在添加配置选项,尝试利用接口选项插件(IOA)面板。我一直在参考wowwiki,特别是讨论使用该面板的页面,但是更一般地说是一堆页面。
我遇到的问题肯定是由于我没有写插件的经验而导致的(我写了一些,但每次都是学习经验)。基本概念是:
-创建主面板-使用XML -为主面板中应该可见的事物(即全局选项)创建子项-使用XML -为每个子项目(配置类别)创建子面板-使用Lua(子面板的数量和名称是动态的) -为每个子面板创建子项目-使用Lua
能够工作的是:
-主面板显示在IOA面板中 -子面板显示在IOA面板中,作为主面板的子项 -我放在子面板上的纹理显示在它们上面
我遇到的问题是:
-如果将子面板创建为主面板的子项,它们会显示在主面板上方 -如果将子面板创建为UIParent的子项,它们将显示在主屏幕上(在IOA窗口未打开时可见) -我在XML文件中创建的任何子Frame作为主面板的子项都不会显示在上面
我目前的代码(缩短阅读量)在消息底部。任何帮助/建议将不胜感激。我知道代码部分有很多,但是我想尽可能清楚地说明我正在做什么。
请注意,我确实在官方的Warcraft UI论坛上发帖,但无法在那里获得任何帮助。
embeds.xml
...剪掉...
<Frame name="MyAddonFrame" parent="UIParent" hidden="false">
<Scripts>
<OnLoad>
self:RegisterEvent("UNIT_TARGET");
self:RegisterEvent("PLAYER_ENTERING_WORLD");
MyAddon_OnLoad(self);
</OnLoad>
<OnEvent function="MyAddon_OnEvent" />
</Scripts>
<Frames>
<Frame parent="MyAddonFrame" inherits="UIDropDownMenuTemplate">
<Frames>
<Button name="MyAddon_MacroSelectDropdownButton">
<Anchors>
<Anchor point="CENTER"/>
</Anchors>
<Scripts>
<OnLoad>
UIDropDownMenu_Initialize(this,
MyAddon_MacroSelectDropdown_OnLoad);
</OnLoad>
<OnClick>
MyAddon_MacroSelectDropdownButton_OnClick();
</OnClick>
</Scripts>
</Button>
<MessageFrame>
<Anchors>
<Anchor point="CENTER"/>
</Anchors>
<FontString text="Message Frame"/>
</MessageFrame>
</Frames>
</Frame>
</Frames>
</Frame>
...剪掉...
Lua Code
...剪掉...
function MyAddon_OnLoad(panel)
MyAddon_CreateOptionsPanel(panel);
MyAddon_ConsoleMessage("Loaded MyAddon: " .. tostring(panel));
end
function MyAddon_CreateOptionsPanel(panel)
panel.name = "MyAddon " .. GetAddOnMetadata("MyAddon", "Version"); -- Set the name for the Category for the Panel
panel.okay = function (self) MyAddonFrame_Close(); end; -- When the player clicks okay, run this function.
panel.cancel = function (self) MyAddonFrame_CancelOrLoad(); end; -- When the player clicks cancel, run this function.
InterfaceOptions_AddCategory(panel); -- Add the panel to the Interface Options
for name,text in pairs(ConfigData) do
MyAddon_CreateMacroPanel(name, panel, panel.name);
end
end
function MyAddon_CreateMacroPanel(macroName, parent, parentName)
MyAddon_ConsoleMessage("Added macro option pane: " .. macroName);
panel = CreateFrame( "Frame", "MyAddon_MacroPanel_" .. macroName, parent);
panel.name = macroName;
panel.parent = parentName;
InterfaceOptions_AddCategory(panel);
-- create a backdrop so we can see that the panel is created
panel:SetFrameStrata("BACKGROUND");
panel:SetWidth(128); -- Set these to whatever h
原文链接 https://stackoverflow.com/questions/2231312
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
是的,子框架默认情况下会覆盖它们的父级。这是一个基本原则。
我认为这里的不一致部分在于您假设需要将所有元素作为主框架的子元素添加。其实不是这样的。
对于两个独立的“面板”,即框架,您可以拥有:
<frame>...</frame> <frame>...</frame>
如果第一个是您的“主框架”,或者是您打算接收插件主要事件(例如ADDON_LOADED)的框架,则第二个可以是其他内容,但仍然属于您。实际上,两者都不属于您,它们处于全局共享范围,所有插件都具有该范围。
因此,如果您想要与特定框架相关的可见元素(在位置和可见性方面),则它们应该是其子元素。否则,您应创建另一个框架。如果将父级隐藏,则其子级将被隐藏。如果移动父级,则其子级会移动,因为它们相对于父级具有相对位置。
这些是默认行为,但除非您确实需要做一些棘手的事情(例如真正的变形框架),否则最好遵循默认行为并创建单独的框架。
<Frame name="MyAddonFrame" parent="UIParent" hidden="false"> <Scripts> <OnLoad> self:RegisterEvent("UNIT_TARGET"); self:RegisterEvent("PLAYER_ENTERING_WORLD"); MyAddon_OnLoad(self); </OnLoad> <OnEvent function="MyAddon_OnEvent" /> </Scripts> <Frames> <Frame parent="MyAddonFrame" inherits="UIDropDownMenuTemplate">
您不需要像上面那样设置父级,但是如果您打算在事件之外的lua代码中引用该帧,则应为其命名:
<Frames> <Frame name="$parentDropDownMenu" inherits="UIDropDownMenuTemplate">
如果这是在“embeds.xml”中,则技术上该文件是为嵌入在插件中的库的一组包含而设计的,而不是用于管理框架,但当然魔兽世界并不知道,所以它可以工作。代码应该更像是MyAddon.xml,MyAddon.lua
主要是需要创建正确大小的框架并将其注册为选项面板的一部分,这是它的要点解释。
请告诉我哪些还不清楚或无法使用。