3

关于插件,以前在nga上看人说,老外大多用单体插件,国内大多用整合插件。

不论是单体还是整合,后者是默认的UI,总是会有自己觉得不舒服的地方,那么就自己来动手微调一下吧。

首先来举一个例子:比如盗贼的能量,默认是在血条的下方,打怪的时候经常要斜着眼睛瞄着那里,很不利于身心健康,所以我们想把它放到中间来

盗贼能量移动代码如下,做成宏就可以了。(说明:这个例子不是我自己写的,原贴来自nga)

/run PlayerFrameManaBar:ClearAllPoints()
/run PlayerFrameManaBar:SetPoint(“CENTER”, UIParent, “CENTER”, 0, -80)
/run PlayerFrameManaBar:SetScale(1.2)
/run PlayerFrameManaBar:SetAlpha(1.0)

不过提供宏不是我们的目的,我们的目的是要知道如何来写类似的宏,所以老胡来解释一下这4行代码的含义:
1、先说每行都有的这个PlayerFrameManaBar,上节课《老胡lua随笔——5)魔兽插件介绍,如何编写一个魔兽插件》里面,我们用到了一个frame,目的是做事件监控,这里的PlayerFrameManaBar也是一个Frame,是一个UI类的Frame,他就代表着玩家的Mana条,对于盗贼来说就是能量条,对于其他职业来说可能是蓝条、怒气等等。

有同学可能要问了,你怎么猜到蓝条是PlayerFrameManaBar的,如果我想搞血条怎么办,有没有一个字典,答案是没有,但是blz提供了一个更好的宏/fstack

在聊天框输入这个命令之后,鼠标移动到任意的界面上,就会提示当前frame的名字(注意,只针对全局frame,局部frame的名字是动态生成的,所以可能是一堆数字之类的,那种就不行了)

2、然后来说第二行的SetPoint这个方法(第一行等下说),这个方法是用来调整UI的位置,这个方法有两种用法,我们来一一介绍:

1)绝对定位法

一般来说,我们会像下面这样来定位一个窗口,指定他的左上角与屏幕左上角的距离,对魔兽来说UIParent代表着屏幕窗体,所以可以这样写。

local xoffset, yoffset = 100,-80(负数代表往下移动,应该是这样,老胡没测试)

/run frame:SetPoint(“TOPLEFT”, UIParent, “TOPLEFT”, xoffset, yoffset)

clipboard.png
2)相对定位(注意,前方高能)
刚才的例子中,frame:SetPoint(“TOPLEFT“, UIParent, “TOPLEFT“, xoffset, yoffset)

left,top大家应该理解了,但是这两个TOPLEFT 是什么鬼?

第一个TOPLEFT指的是当前frame的左上角,第二个TOPLEFT指的是UIParent的左上角,合起来,就是说frame左上角的点,距离UIParent左上角是100,80。想想一下两本书,一个大一个小,先左上角对齐,然后把小的那本,往右100,再往下80。

下面再来说一个例子,请思考,如果我想把一个方块放到另一个方块的右边,怎么做?

clipboard.png
按照刚才的思路,先把两本书的左上角对齐,然后往右移动Frame1宽度的距离就行了,因为是顶部对齐,所以不用往下移动,所以这样就可以了。

local xoffset, yoffset = Frame1:GetWidth(), 0

Frame2:SetPoint(“TOPLEFT”, Frame1, “TOPLEFT”, xoffset, yoffset)

再来一个,这就需要不但往右,还要往下,往下的距离是两个frame的高度差。

clipboard.png
local xoffset, yoffset = Frame1:GetWidth(), Frame1:GetHeight()-Frame2:GetHeight()

Frame2:SetPoint(“TOPLEFT”, Frame1, “TOPLEFT”, xoffset, yoffset)

说明,上面的Frame1:GetHeight()-Frame2:GetHeight()应该是不对的,上面我们说过,向下是负数,所以应该取一个负,但是这里不是我们的关键,请忽略这个,我们只讲思路,正负问题留给你去尝试了,多试才能会啊。

经过上面几个例子,我们应该有点会了,但是老胡告诉你,我们上面的代码实际上是很low的,来我们来看一下这个方法的完全体:

Frame:SetPoint(“point” [, relativeTo [, “relativePoint” [, xOffset [, yOffset]]]])

详细介绍参见api:http://wowprogramming.com/doc...

第一个参数是point,我们上面大多用的TOPLEFT,实际上他还有很多别的取值:CENTER BOTTOM TOP LEFT RIGHT BOTTOMLEFT BOTTOMRIGHT TOPLEFT TOPRIGHT

比如刚才这个例子,我们刚才是说,先左上角对齐,然后Frame2往右移动Frame:GetWidth()的距离,但是我们也可以想象成,我直接用Frame2的左上角,对齐Frame1的右上角,然后不移动,对比一下这两种的写法:

--第一种
local xoffset, yoffset = Frame1:GetWidth(), 0
Frame2:SetPoint("TOPLEFT", Frame1, "TOPLEFT", xoffset, yoffset)

--第二种
local xoffset, yoffset = 0,0
Frame2:SetPoint("TOPLEFT", Frame1, "TOPRIGHT", xoffset, yoffset)

clipboard.png

然后下面这个,就是2的左下,对齐到1的右下。

clipboard.png
2的中间点对齐到1的中间点(想象一下如果都用TOPLEFT,是不是繁琐了不少)

clipboard.png

回顾一下我们开头的例子,能量条的中间点,对齐到UIParent的中间点,然后往右移动0,往下移动80

/run PlayerFrameManaBar:SetPoint(“CENTER”, UIParent, “CENTER”, 0, -80)

好,SetPoint方法就啰嗦到这里。到这里大家应该发现了,我上面提到说有两种用法,绝对定位和相对定位,实际上并没有,只有相对定位这一种(完事无绝对啊),绝对定位,其实就是相对于屏幕,而屏幕本身也是一个frame,叫UIParent,记住了,这个名字很常用。

如果想看某个Frame的Point,可以用xxFrame:GetPoint()方法哦。

3、再回到最初的例子,来说最后几个,这几个就简单了。

/run PlayerFrameManaBar:ClearAllPoints()
/run PlayerFrameManaBar:SetPoint(“CENTER”, UIParent, “CENTER”, 0, -80)
/run PlayerFrameManaBar:SetScale(1.2)
/run PlayerFrameManaBar:SetAlpha(1.0)

第一行,ClearAllPoints,跟SetPoint刚好相反,是用来删掉frame之前设置的Point,因为后设置的Point并不会直接覆盖前面的,也就是说可以设置多个Point(多个Point的用法老胡也没用过),一般来说,我们设置新的Point之前,需要把旧的删掉,所以无脑加一下就行了。

第三行SetScale是设置frame的尺寸,1是原本的大小,0.9就代表只有原来的0.9倍大小,1.2就代表放大到1.2倍

第四行SetAlpha,是设置透明度,1是完全不透明,0.1~0.9是半透明,越小越透明,0就看不见了。

好啦,今天就写到这里,SetPoint部分比较啰嗦,还望大家耐心。有问题可以找我讨论哦。


老胡聊聊天
104 声望26 粉丝

Coding in the rain, coding anywhere.我的b站账号:[链接]