|
发表于 2015-8-13 20:33:56
|
显示全部楼层
从零开始学插件——牛牛爸的插件学习笔记(4)
在上小一节,我们的插件基本上已经达到了可以用的程度,但插件代码还需要一些优化,在使用上也可以更方便一些。这一节,就让我们来做一些锦上添花、画龙点睛的工作。
首先,我们要引入“自定义函数”的概念。所谓自定义函数,就是自己写一组代码来实现某个功能,当我们需要用这个功能的时候,可以直接调用这个函数,而不需要每次都写相同的代码。以我们的代码为例,CapHide.lua文件与Config.lua文件都有7行相同的判断语句,我们可以把这个判断语句写成一个函数,代码如下:
- function BillTools_CapHide()
- if Bill_CapHide then
- MainMenuBarLeftEndCap:Hide()
- MainMenuBarRightEndCap:Hide()
- else
- MainMenuBarLeftEndCap:Show()
- MainMenuBarRightEndCap:Show()
- endend
复制代码
注意,我们function前面没有local,也就是说这是一个全局函数,因为我们CapHide.lua与Config.lua两个文件都将用到这个函数。作为全局函数,我们必须给它一个相对复杂的命名,并注意不要跟我们之前的变量名重名。我们可以把这段代码放到CapHide.lua文件中,原CapHide.lua文件中的判断语句从“if Bill_CapHide then”到“end”,可以改为“BillTools_CapHide()”了,代码如下:
- local f = CreateFrame("Frame")
- f:RegisterEvent("PLAYER_LOGIN")
- f:SetScript("OnEvent", function(self, event, ...)
- if event == "PLAYER_LOGIN" then
- BillTools_CapHide()
- endend)
复制代码
同样,我们可以替换Config.lua文件中的判断语句,Config.lua文件中最后一段,现在代码如下:
- f.okay = function()
- Bill_CapHide=c1:GetChecked()
- BillTools_CapHide()end
复制代码
现在代码是不是简洁多了吧?但我们锦上添花的工作还没有结束。你会不会觉得每次调出游戏菜单,再点击“界面”按钮,再点击“插件”选项卡,再选择“CapHide”来设置我们的插件有些麻烦?可不可以通过一个命令直接调出我们插件的设置界面?答案当然是可以的。请在Config.lua文件加上以下代码:
- SLASH_BILLTOOLS1 = "/billtools"
- SLASH_BILLTOOLS2 = "/bt"
- SlashCmdList["BILLTOOLS"] = function()
- -- 暴雪bug,首次调用需调用两次才能打开目标界面
- InterfaceOptionsFrame_OpenToCategory("CapHide")
- InterfaceOptionsFrame_OpenToCategory("CapHide")end
复制代码
我们从上往下看,SLASH_BILLTOOLS1和SLASH_BILLTOOLS2看似两个全局变量,但却不是普通的全局变量,它们在这里注册了两个命令,分别是"/billtools"和"/bt"。SlashCmdList是什么呢?你可以把它理解为一个接受命令的接口,当你在聊天栏输入一条命令时(以“/”开头),它会检索已注册的命令有没有符合条件的,如果有,它便会执行相关命令的代码。那我们这里要执行的是什么代码呢?首先,我们看到的是一行注释。我们的学习笔记进行到了第4节才提到注释,真是太不应该了。不过相信很多同学都已经知道如何在lua文件中使用注释了。注释下面那两行代码才是我们要执行的代码,至于为什么写了两行相同的代码,注释里已经写得很明白了。这也是我们在这里使用注释的原因,如果没有这行注释,日后你看到这两行相同的代码,还会以为你当时不小心多输了一行呢。因为我们经常会在Notepad++里按“Ctrl+S”的时候不小心按到“Ctrl+D”。
InterfaceOptionsFrame_OpenToCategory("CapHide")的意思应该比较好理解,就是打开插件界面里名字为“CapHide”的窗体。细心的同学可能会提出一个疑问,既然是打开“CapHide”窗体,注册命令的时候为什么不注册"/caphide"或"/ch"?因为我们的插件做到这里,隐藏动作条两边装饰的功能已经基本完结了,而我们的插件还将继续。换言之,CapHide将作为我们插件的一个功能存在,而我们的插件将换一个新的名字。既然是Bill的插件,里面是一些小工具的集合,就干脆叫“BillTools”吧。
保存你的插件,用“/rl”命令重新载入一遍插件,现在输入"/billtools"或"/bt"命令,是不是可以直接打开我们插件的设置界面了吧?最后,让我们再加上一行代码,让插件在每次在你进入游戏或重载插件时提示你插件加载成功,并告知可以使用"/bt"命令打开设置界面。代码如下:
DEFAULT_CHAT_FRAME:AddMessage("|cff00CCFFBillTools加载成功!使用/bt命令打开设置界面!|r")
复制代码
这行代码加到哪里合适呢?当然是CapHide.lua文件的“BillTools_CapHide()”下面了。既然我们已经用“BillTools”给插件重新命名了,那就把toc文件和lua文件相关的名称也改一下吧。恰好我在写这篇学习笔记时,WOW已经从6.1升级到6.2,toc文件对应的版本号也得调整一下了。最终,调整后的插件文件代码如下:
BillTools.toc
- ## Interface: 60200
- ## Version: 0.2
- ## Title: BillTools
- ## Notes: Bill's Interface Package
- ## Title-zhCN: [|cff00CCFFBillTools|r] Bill的工具箱
- ## Notes-zhCN: Bill的小插件集合
- ## Author: Bill
- ## SavedVariables: Bill_CapHide
- CapHide.luaConfig.lua
复制代码
CapHide.lua
- function BillTools_CapHide()
- if Bill_CapHide then
- MainMenuBarLeftEndCap:Hide()
- MainMenuBarRightEndCap:Hide()
- else
- MainMenuBarLeftEndCap:Show()
- MainMenuBarRightEndCap:Show()
- end
- end
- local f = CreateFrame("Frame")
- f:RegisterEvent("PLAYER_LOGIN")
- f:SetScript("OnEvent", function(self, event, ...)
- if event == "PLAYER_LOGIN" then
- BillTools_CapHide()
- DEFAULT_CHAT_FRAME:AddMessage("|cff00CCFFBillTools加载成功!使用/bt命令打开设置界面!|r")
- endend)
复制代码
Config.lua
- -- 注册、响应命令
- SLASH_BILLTOOLS1 = "/billtools"
- SLASH_BILLTOOLS2 = "/bt"
- SlashCmdList["BILLTOOLS"] = function()
- -- 暴雪bug,首次调用需调用两次才能打开目标界面
- InterfaceOptionsFrame_OpenToCategory("BillTools")
- InterfaceOptionsFrame_OpenToCategory("BillTools")
- end
- -- 主界面
- local f = CreateFrame("Frame", nil, InterfaceOptionsFramePanelContainer)
- f.name = "BillTools"
- InterfaceOptions_AddCategory(f)
- -- 主标题
- local r = f:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
- r:SetPoint("TOP", 0, -15)
- r:SetText("Bill的工具箱")
- -- 标题
- r = f:CreateFontString("r1", "ARTWORK", "GameFontNormalLarge")
- r:SetPoint("TOPLEFT", 10, -45)
- r:SetText("界面")
- -- 横线
- r = f:CreateTexture(nil, "BACKGROUND")
- r:SetPoint("TOPLEFT", "r1", "TOPLEFT", 0, -20)
- r:SetSize(600,1)
- r:SetTexture(1, 1, 1, 0.6)
- -- 复选框
- local c1 = CreateFrame("CheckButton", "x", f, "OptionsCheckButtonTemplate")
- c1:SetPoint("TOPLEFT", "r1", "TOPLEFT", 0, -25)
- c1:SetScript("OnShow", function(c)
- c:SetChecked(Bill_CapHide)
- end)
- getglobal(c1:GetName().."Text"):SetText("隐藏动作条两边装饰")
- -- 确定
- f.okay = function()
- Bill_CapHide=c1:GetChecked()
- BillTools_CapHide()end
复制代码
改动的地方比较多,但如果你已经熟悉之前代码的话,一定会一眼看出哪些代码改动了,并能够理解这些改动的作用。这里要着重说下的是Config.lua文件,我们首次使用CreateTexture画了一条横线,也首次使用了SetPoint的相对定位。已经理解CreateFontString的你应该不难理解CreateTexture,已经理解绝对定位的你应该也不难理解相对定位,因为它们都是类似的。
现在,我们的插件已经初具雏形,尽管它的功能还很有限,但我们已经走过了编写一个简单插件的基本流程。剩下的工作就是对这个插件的功能进行扩展了。想必已经对Lua知识融会贯通的你已经想到下一步该加上什么功能了。是屏蔽聊天窗口那些烦人的广告?还是对绿色装备自动贪婪?对于那些能够举一反三的朋友,已经可以脱离我的学习笔记,依靠从相关网站查询到的相关知识来扩展自己的插件了。对于那些还想跟着我的学习笔记一路走下去的朋友,我们下小一节见! |
|