關於插件,之前在nga上看人說,老外大多用單體插件,國內大多用整合插件。api
不管是單體仍是整合,後者是默認的UI,老是會有本身以爲不舒服的地方,那麼就本身來動手微調一下吧。測試
首先來舉一個例子:好比盜賊的能量,默認是在血條的下方,打怪的時候常常要斜着眼睛瞄着那裏,很不利於身心健康,因此咱們想把它放到中間來lua
盜賊能量移動代碼以下,作成宏就能夠了。(說明:這個例子不是我本身寫的,原貼來自nga)spa
/run PlayerFrameManaBar:ClearAllPoints() /run PlayerFrameManaBar:SetPoint(「CENTER」, UIParent, 「CENTER」, 0, -80) /run PlayerFrameManaBar:SetScale(1.2) /run PlayerFrameManaBar:SetAlpha(1.0)
不過提供宏不是咱們的目的,咱們的目的是要知道如何來寫相似的宏,因此老胡來解釋一下這4行代碼的含義:
一、先說每行都有的這個PlayerFrameManaBar,上節課《老胡lua隨筆——5)魔獸插件介紹,如何編寫一個魔獸插件》裏面,咱們用到了一個frame,目的是作事件監控,這裏的PlayerFrameManaBar也是一個Frame,是一個UI類的Frame,他就表明着玩家的Mana條,對於盜賊來講就是能量條,對於其餘職業來講多是藍條、怒氣等等。插件
有同窗可能要問了,你怎麼猜到藍條是PlayerFrameManaBar的,若是我想搞血條怎麼辦,有沒有一個字典,答案是沒有,可是blz提供了一個更好的宏/fstack3d
在聊天框輸入這個命令以後,鼠標移動到任意的界面上,就會提示當前frame的名字(注意,只針對全局frame,局部frame的名字是動態生成的,因此多是一堆數字之類的,那種就不行了)code
二、而後來講第二行的SetPoint這個方法(第一行等下說),這個方法是用來調整UI的位置,這個方法有兩種用法,咱們來一一介紹:blog
1)絕對定位法事件
通常來講,咱們會像下面這樣來定位一個窗口,指定他的左上角與屏幕左上角的距離,對魔獸來講UIParent表明着屏幕窗體,因此能夠這樣寫。ip
local xoffset, yoffset = 100,-80(負數表明往下移動,應該是這樣,老胡沒測試)
/run frame:SetPoint(「TOPLEFT」, UIParent, 「TOPLEFT」, xoffset, yoffset)
2)相對定位(注意,前方高能)
剛纔的例子中,frame:SetPoint(「TOPLEFT「, UIParent, 「TOPLEFT「, xoffset, yoffset)
left,top你們應該理解了,可是這兩個TOPLEFT 是什麼鬼?
第一個TOPLEFT指的是當前frame的左上角,第二個TOPLEFT指的是UIParent的左上角,合起來,就是說frame左上角的點,距離UIParent左上角是100,80。想一想一下兩本書,一個大一個小,先左上角對齊,而後把小的那本,往右100,再往下80。
下面再來講一個例子,請思考,若是我想把一個方塊放到另外一個方塊的右邊,怎麼作?
按照剛纔的思路,先把兩本書的左上角對齊,而後往右移動Frame1寬度的距離就好了,由於是頂部對齊,因此不用往下移動,因此這樣就能夠了。
local xoffset, yoffset = Frame1:GetWidth(), 0
Frame2:SetPoint(「TOPLEFT」, Frame1, 「TOPLEFT」, xoffset, yoffset)
再來一個,這就須要不但往右,還要往下,往下的距離是兩個frame的高度差。
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)
而後下面這個,就是2的左下,對齊到1的右下。
2的中間點對齊到1的中間點(想象一下若是都用TOPLEFT,是否是繁瑣了很多)
回顧一下咱們開頭的例子,能量條的中間點,對齊到UIParent的中間點,而後往右移動0,往下移動80
/run PlayerFrameManaBar:SetPoint(「CENTER」, UIParent, 「CENTER」, 0, -80)
好,SetPoint方法就囉嗦到這裏。到這裏你們應該發現了,我上面提到說有兩種用法,絕對定位和相對定位,實際上並無,只有相對定位這一種(完事無絕對啊),絕對定位,其實就是相對於屏幕,而屏幕自己也是一個frame,叫UIParent,記住了,這個名字很經常使用。
若是想看某個Frame的Point,能夠用xxFrame:GetPoint()方法哦。
三、再回到最初的例子,來講最後幾個,這幾個就簡單了。
/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部分比較囉嗦,還望你們耐心。有問題能夠找我討論哦。