魔兽插件编写普及教程
ADDONS编写普及
作者:VVER
前言
22号基本写完。比预计的要快
这个不是数学书或者语文书。我不想也没有那个能力写成那样...........
所以请抱着看小说的态度来看。
因为ADDONS的编写是一个整体。我实在无法分清哪个是要先说 哪个是要后说
所以有看不懂的地方就跳过去。接着看下面
前几层楼写的相对详细些。后几层楼更多的是提示。我还是希望看官能自己分析,自己动手研究
最后。短短的6层楼包含了我半年的心血,而且我语文课真的是没好好去上
所以如果一时看不懂。请多读几遍 或者回帖指出,我会尽力解释的
基础
如果你完全的彻底的不了解什么是ADDONS,请先参考CAMUS老大的帖子的2楼:
插件,宏 常见问题解答
任何一个ADDONS都是由3种文件组成
LUA XML TOC
TOC是ADDONS的标签,就好比是一本书的封面
他将告诉WOW我们编写的ADDONS的名字。作者。版本号。注释。主要文件,依赖文件,保存文件
所以任何一个ADDONS中TOC文件都是必不可少的
举个例子
我们编写如下信息保存为firs.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。最大长度 maxValue
2。最小长度 minValue
3。当前长度 Value
要动态的改变StatusBar就需要用脚本(Scripts)中的事件实时的设置当前长度(Value)
(这句话可能有点饶口。不过我就这点语文水平了。。见谅见谅)
准备工作
首先根据我们之前的概念。一个TOC文件是必不可少的,编个
## Interface: 1600
## Title: 我的第一插件
## Notes: 真的是我的第一插件哦
然后我们当然得用XML来定义StatusBar这个框体,那么编写个l
不过WOW并不知道我们写了l这个文件。我们得告诉他。所以在中加一句(红的部分)## Interface: 1600
## Title: 我的第一插件
## Notes: 真的是我的第一插件哦
好了 正式开始编写l
按照基本的XML文件格式 先写好基本的嵌套
<StatusBar>
</StatusBar>
起个好名字
<StatusBar name="haomingzi">
</StatusBar>
注意红的那句。现在我们名叫haomingzi的StatusBar 会根据变量SVALUE自动改变长短了
(这里我们用到了脚本。后面会详细解释的。先记得<Scripts>是脚本就可以了)
<StatusBar name="haomingzi">
游戏xml文件修改<Scripts>
<OnUpdate>
haomingzi:SetValue(SVALUE);
</OnUpdate>
</Scripts>
</StatusBar>
现在我们把变量SVALUE设置为玩家的血量
那么:
<StatusBar name="haomingzi">
<Scripts>
<OnUpdate>
haomingzi:SetValue( UnitHealth("player") );
</OnUpdate>
</Scripts>
</StatusBar>
OK。一个玩家的HP条就写出来了
当然仅仅这几行还远远不够,继续完善下
先把最大和最小长度定义好
<StatusBar name="haomingzi" minValue="0" maxValue="100">
<Scripts>
<OnUpdate>
haomingzi:SetValue( UnitHealth("player") );
</OnUpdate>
</Scripts>
</StatusBar>
这里我们设置的是0到100。显然玩家的血量肯定不会在0到100之内的。
那么我们就要把他转换为百分比
<StatusBar name="haomingzi" minValue="0" maxValue="100">
<Scripts>
<OnUpdate>
local SVALUE=( UnitHealth("player") / UnitHealthMax("player") )*100                                  haomingzi:SetValue(SVALUE);
</OnUpdate>
</Scripts>
</StatusBar>
设定下他的位置,比方把他放在屏幕的中间
(具体的如何设置位置。在楼下会讲。现在只要知道红部分的代码是设定位置就可以了)
<StatusBar name="haomingzi" minValue="0" maxValue="100">
<Anchors>
<Anchor point="center" relativeTo="UIparent" relativePoint="center"/>
</Anchors>
<Scripts>
<OnUpdate>
local SVALUE=( UnitHealth("player") / UnitHealthMax("player") )*100                                  haomingzi:SetValue(SVALUE);
</OnUpdate>
</Scripts>
</StatusBar>
设定一下大小
<StatusBar name="haomingzi" minValue="0" maxValue="100">
<Size>
<AbsDimension x="70" y="8"/>
</Size>
<Anchors>
<Anchor point="center" relativeTo="UIparent" relativePoint="center"/>
</Anchors>
<Scripts>
<OnUpdate>
local SVALUE=( UnitHealth("player") / UnitHealthMax("player") )*100                                  haomingzi:SetValue(SVALUE);
</OnUpdate>
</Scripts>
</StatusBar>
当然他长什么样子我们还没弄呢~
<StatusBar name="haomingzi" minValue="0" maxValue="100">
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<Size>
<AbsDimension x="70" y="8"/>
</Size>
<Anchors>
<Anchor point="center" relativeTo="UIparent" relativePoint="center"/>
</Anchors>
<Scripts>
<OnUpdate>
local SVALUE=( UnitHealth("player") / UnitHealthMax("player") )*100                                  haomingzi:SetValue(SVALUE);
</OnUpdate>
</Scripts>
</StatusBar>
最后给头尾加上最基本的<ui></ui>嵌套。就大功告成了
<ui>
<StatusBar name="haomingzi" minValue="0" maxValue="100">
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<Size>
<AbsDimension x="70" y="8"/>
</Size>
<Anchors>
<Anchor point="center" relativeTo="UIparent" relativePoint="center"/>
</Anchors>
<Scripts>
<OnUpdate>
local SVALUE=( UnitHealth("player") / UnitHealthMax("player") )*100                                  haomingzi:SetValue(SVALUE);
</OnUpdate>
</Scripts>
</StatusBar>
</ui>
CODE:<Anchors>
<Anchor point="CENTER" relativeTo="Minimap" relativePoint="CENTER">
<Offset>
<AbsDimension x="55" y="-55"/>
</Offset>
</Anchor>
</Anchors>
这样的代码就是用来定义的位置的
数学课和物理课都上过把?(虽然我很讨厌我们过去的数学老师><)
想知道任何一个物体的位置。只要有一个固定的参考物。再有与参考物体的相对坐标。就可以了
---------------------------------------------------------------------------------------------------先来点基本概念
我们用一个方框来表示框体,那么
TOP
TOPLEFT            _______________      TOPRIGHT
|                              |
LEFT                |      CENTER          |        RIGHT
|                              |
BOTTOMLEFT      ——————————        BOTTOMLEFT
BOTTOM
应该有点头绪了把?
之前那段代码的意思就是 把位置定义在
小地图的中心点和我们的框体的中心点X坐标为55 Y坐标为55的地方
如果看不明白这句话  不要紧 我们一句一句的来分析
------------------------------------------------------------------------------------------------------具体分析
头一句和最后一句
<Anchors>
</Anchors>
这个嵌套是告诉WOW:中间的代码是定义位置
第二句和倒数第二句
<Anchor point="CENTER" relativeTo="Minimap" relativePoint="CENTER">
</Anchor>
这个嵌套就是告诉WOW 我们开始定义位置了。
先看第二句。
point="CENTER" 参考之前我画的那张很丑陋的图。
意思就是:要定义位置的框体(为了描述方便。以下简称为框体A)的中心点(CENTER)作为定义点。(定义点这个名词是我杜撰的。如果不明白。先接着往下看)
relativeTo="Minimap"
意思就是:给我们的框体A设置一个参考物(为了描述方便。以下把参考物简称为框体B)
在这里。就是把框体B设置为小地图(Minimap)
relativePoint="CENTER"
同样的。也得给我们的框体B设置一个定义点
在这里。就设置为中心点(CENTER)
现在解释一下定义点这个我杜撰的名词
为什么要有定义点这个概念呢?
因为所有的框体都不是一个点。而是一个平面。而相对坐标只能是点与点的坐标。所以就必须在框体上一个点来定义坐标
而这个点。就是我所谓的定义点
至于一个框体的定义点可以设置为那些,参考上面我画的那张丑陋的图
搞明白了以上的概念。那么中间的那段代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。