admin管理员组

文章数量:1532360

2023年12月24日发(作者:)

魔兽插件编写普及教程ADDONS编写普及作者:VVER前言22号基本写完。比预计的要快这个不是数学书或者语文书。我不想也没有那个能力写成那样...........所以请抱着看小说的态度来看。因为ADDONS的编写是一个整体。我实在无法分清哪个是要先说 哪个是要后说所以有看不懂的地方就跳过去。接着看下面前几层楼写的相对详细些。后几层楼更多的是提示。我还是希望看官能自己分析,自己动手研究最后。短短的6层楼包含了我半年的心血,而且我语文课真的是没好好去上所以如果一时看不懂。请多读几遍 或者回帖指出,我会尽力解释的基础如果你完全的彻底的不了解什么是ADDONS,请先参考CAMUS老大的帖子的2楼:插件,宏 常见问题解答任何一个ADDONS都是由3种文件组成LUA XML TOCTOC是ADDONS的标签,就好比是一本书的封面他将告诉WOW我们编写的ADDONS的名字。作者。版本号。注释。主要文件,依赖文件,保存文件所以任何一个ADDONS中TOC文件都是必不可少的举个例子我们编写如下信息保存为文件## Interface: 1600## Title: 我是一个插件## Notes: 虽然我没有内容,但是我真的是插件然后我们进入游戏。会发现在插件列表中真的出现了我们的这个ADDONS。虽然没有任何作用。但是我们还真的迈开了第一步XML是定义ADDONS组成的框体(或者用元素这个词更贴切些。不过我更喜欢框体这个词)我们的ADDONS有多少个按扭。多少个文字。每个按扭长什么样子。具体在什么位置 等等等等都是在XML文件中定义的。我会用大量的篇幅介绍XML文件的写法。敬请期待如果XML是定义ADDONS静态的框体。那么LUA就是把这些框体动态化比如说按扭在什么时候弹出。血条在多少的时候改变颜色。进入战斗的时候把人物血条移动到屏幕中间等等等等。都是在LUA中定义

总之,LUA就是把死的框体 真正的发挥出作用来当然LUA还可以使得我们的代码简化,本地化。等等等等一个ADDONS中LUA并不是不可或缺的。但是一个ADDONS编写的好与坏。就看LUA的了StatusBar在之前我们大概知道了ADDONS的一些基本概念那么现在。在各种类型的框体中挑一个StatusBar来说说基本概念StatusBar:是WOW中用来定义类似施法条。进度条之类的一种框体,说白了就是可以根据某个数值,实时的改变条条的长短一个StatusBar有3个重要的参数

1。最大长度 maxValue2。最小长度 minValue3。当前长度 Value要动态的改变StatusBar就需要用脚本(Scripts)中的事件实时的设置当前长度(Value)(这句话可能有点饶口。不过我就这点语文水平了。。见谅见谅)准备工作首先根据我们之前的概念。一个TOC文件是必不可少的,编个## Interface: 1600## Title: 我的第一插件## Notes: 真的是我的第一插件哦然后我们当然得用XML来定义StatusBar这个框体,那么编写个不过WOW并不知道我们写了这个文件。我们得告诉他。所以在中加一句(红色的部分)## Interface: 1600## Title: 我的第一插件## Notes: 真的是我的第一插件哦好了 正式开始编写按照基本的XML文件格式 先写好基本的嵌套起个好名字注意红色的那句。现在我们名叫haomingzi的StatusBar 会根据变量SVALUE自动改变长短了(这里我们用到了脚本。后面会详细解释的。先记得是脚本就可以了) haomingzi:SetValue(SVALUE);

现在我们把变量SVALUE设置为玩家的血量那么: haomingzi:SetValue( UnitHealth("player") ); OK。一个玩家的HP条就写出来了当然仅仅这几行还远远不够,继续完善下先把最大和最小长度定义好 haomingzi:SetValue( UnitHealth("player") ); 这里我们设置的是0到100。显然玩家的血量肯定不会在0到100之内的。那么我们就要把他转换为百分比 local SVALUE=( UnitHealth("player") / UnitHealthMax("player") )*100 haomingzi:SetValue(SVALUE); 设定下他的位置,比方把他放在屏幕的中间(具体的如何设置位置。在楼下会讲。现在只要知道红色部分的代码是设定位置就可以了) local SVALUE=( UnitHealth("player") / UnitHealthMax("player") )*100 haomingzi:SetValue(SVALUE); 设定一下大小

local SVALUE=( UnitHealth("player") / UnitHealthMax("player") )*100 haomingzi:SetValue(SVALUE); 当然他长什么样子我们还没弄呢~ local SVALUE=( UnitHealth("player") / UnitHealthMax("player") )*100 haomingzi:SetValue(SVALUE); 最后给头尾加上最基本的嵌套。就大功告成了 local SVALUE=( UnitHealth("player") / UnitHealthMax("player") )*100 haomingzi:SetValue(SVALUE); CODE:

这样的代码就是用来定义的位置的数学课和物理课都上过把?(虽然我很讨厌我们过去的数学老师

><)想知道任何一个物体的位置。只要有一个固定的参考物。再有与参考物体的相对坐标。就可以了---------------------------------------------------------------------------------------------------先来点基本概念

我们用一个方框来表示框体,那么 TOP TOPLEFT _______________ TOPRIGHT | | LEFT | CENTER | RIGHT | | BOTTOMLEFT —————————— BOTTOMLEFT BOTTOM应该有点头绪了把?之前那段代码的意思就是 把位置定义在

小地图的中心点和我们的框体的中心点X坐标为55 Y坐标为55的地方如果看不明白这句话 不要紧 我们一句一句的来分析------------------------------------------------------------------------------------------------------具体分析头一句和最后一句这个嵌套是告诉WOW:中间的代码是定义位置第二句和倒数第二句 这个嵌套就是告诉WOW

我们开始定义位置了。先看第二句。point="CENTER"

参考之前我画的那张很丑陋的图。意思就是:要定义位置的框体(为了描述方便。以下简称为框体A)的中心点(CENTER)作为定义点。(定义点这个名词是我杜撰的。如果不明白。先接着往下看)relativeTo="Minimap"意思就是:给我们的框体A设置一个参考物(为了描述方便。以下把参考物简称为框体B)在这里。就是把框体B设置为小地图(Minimap)relativePoint="CENTER"同样的。也得给我们的框体B设置一个定义点在这里。就设置为中心点(CENTER)现在解释一下定义点这个我杜撰的名词为什么要有定义点这个概念呢?因为所有的框体都不是一个点。而是一个平面。而相对坐标只能是点与点的坐标。所以就必须在框体上找一个点来定义坐标而这个点。就是我所谓的定义点至于一个框体的定义点可以设置为那些,参考上面我画的那张丑陋的图搞明白了以上的概念。那么中间的那段代码

CODE:

也就不难理解是什么意思了。这正是设置2个定义点之间的相对坐标-------------------------------------------------------------------------------------------------------进阶为什么一向崇尚操作简单的暴雪要把位置的定义弄的这么复杂呢?似乎我们只要变换2个定义点之间的相对坐标。那么无论我们把定义点怎么设置 都可以达到同样的效果其实。是因为框体的大小有时候是不固定的。比如我想实现这样的效果:在玩家血条的左边显示HP的具体数值如果这么定义位置:

CODE:

。 。 。 。似乎可以到达效果,可是HP有多有少。当HP为3位数的时候。数值是在血条的左边。但是但HP为4为数的时候。数值就超过了左边挡主了部分血条。所以。得这么写

CODE:

。 。 。 。

这样。无论HP为多少。数值的右侧永远都和血条的坐侧对齐---------------------------------------------------------------------------------------------------------------PS:当相对坐标为0,0的时候。代码可以简化比如刚才的代码可以简化为CODE:

注意:别漏看了第三句最后的那个反斜杠脚本看到这里。我们对框体的定义应该有了很大的了解。现在定义一个自己的框体应该没什么难度了把?在STATUSBAR部分我们提到了脚本。脚本我个人觉得是ADDONS的精髓

弄懂了脚本部分。那么去他的FLEXBAR

去他的DAB

去他的DUF

我们不需要了。我们自己就可以来做了基本概念什么是脚本。通俗的说:脚本就是告诉框体在什么时候执行什么命令同样的我们用这样的嵌套来表示代码中脚本的部分具体的举个例子还记得FLEXBAR或者DAB一个很实用的功能把?当鼠标进入按扭的区域 按纽显示 离开则隐藏现在我们直接在ADDONS中写(为了描述方便起见 以下只写出代码中我们需要注意的部分)这个嵌套就是鼠标进入框体的区域需要执行的命令则是鼠标离开框体的区域需要执行的命令

如何?是不是很简单呢?接着来。FLEXBAR或者DAB还有很多神奇的功能。比如根据条件自动改变按扭的位置 透明度 缩放 等等等如果我们直接在ADDONS中编写也很方便比如进入战斗状态 自动出现按扭 反之隐藏是框体被加载的时候需要执行的命令这里。我们给button_1这个框体注册了2个事件:玩家进入战斗和玩家离开战斗是注册的事件发生的时候需要执行的命令这里。我们用了一个判断语句。当事件为玩家进入战斗的时候 显示按扭1

当事件为玩家离开战斗的时候 隐藏按扭1同样的脚本和框体一样 不可能仅仅只有我上面所说的那几个。更多的脚本需要你自己去发现。。我不想罗嗦了。更多的惊喜以上2个只是很简单的例子。脚本中执行的命令还可以是相互调用。相互依存的来实现更多更复杂的功能这时候。仅仅一个XML文件已经不能满足我们的需要了。我们得在LUA文件中来编写LUA如果你有耐心看完了上面的全部内容 并且亲手去实验了

那么如何编写一个XML文件应该了然与胸了把当然一个精巧的ADDONS不可能仅仅只有XML文件而已。他还需要LUA文件LUA文件当然就是用LUA格式写的具体的LUA的语法 限与帖子的篇幅,不能详尽说明。好在现在网上的资料很多的我只说几个个人觉得很有用的部分1。引用LUA和定义函数先回头看6楼的最后那段代码我们可以把脚本的部分放到LUA中来写。首先我们新建一个文件然后在XML文件里面要告诉WOW

我们写了文件