LUA學(xué)習(xí)筆記:魔獸世界自定義界面插件
LUA學(xué)習(xí)筆記中魔獸世界自定義界面插件 是本文要介紹的內(nèi)容,主要是來(lái)了解操作系統(tǒng)的庫(kù)文件沒(méi)有包含在魔獸世界UI的PATH路徑之中,本文是對(duì)魔獸世界自定義界面插件的介紹,內(nèi)容主要是如何進(jìn)行自定義的UI插件(Custom UI)進(jìn)行定義:
用戶界面(UI - User Interface)向?qū)?/p>
近來(lái)有許多玩家蜂擁而入了WOW團(tuán)體,他們中有許多,就像我一樣,有著一些編程經(jīng)驗(yàn)并且希望試著創(chuàng)建UI插件。由于有著眾多編程語(yǔ)言和接口,不少人可能會(huì)走些彎路,我希望以下內(nèi)容能夠減少以上這些情況(至少減少為尋找那些函數(shù)的資料而頭痛的煩惱):
(譯注:其實(shí)并不難,其內(nèi)容只涉及到一些腳本語(yǔ)言和XML文檔的知識(shí),就算你沒(méi)有寫(xiě)過(guò)程序,也能勝任。)
1、準(zhǔn)備開(kāi)始
(1)可以選用的工具
第一步必須明白將要做些什么,但是為了能夠正確的開(kāi)始,我們必須選擇一些編寫(xiě)腳本的工具。我想首先重要的一點(diǎn)是編輯器(用專業(yè)術(shù)語(yǔ)來(lái)說(shuō)就是IDE-integrated development evironment), 這可能有許多種選擇。由于我們編寫(xiě)腳本的語(yǔ)言是LUA(譯注:一種腳本語(yǔ)言,參見(jiàn):www.lua.org),我們需要的編輯器應(yīng)當(dāng)是針對(duì)這種語(yǔ)言的,以下十供選擇的列表:
blua.sourceforge.net/ (譯注:sourceforge.net是一個(gè)著名的開(kāi)源項(xiàng)目網(wǎng)站)
B:Lua這是首當(dāng)其充的腳本編輯工具之一,它提供了強(qiáng)大的IDE所提供的功能,足夠用來(lái)編輯WOW的UI。而且它是用Java語(yǔ)言編寫(xiě)的,不論在何種操作系統(tǒng)中尼都能運(yùn)行它。
www.ideais.com.br/luaeclipse/ (譯注:一個(gè)運(yùn)用于Eclipse IDE下的插件,建議使用過(guò)Java語(yǔ)言的專業(yè)人士使用。)
Lua Eclipse ? 這是另外一個(gè)Java環(huán)境的IDE,我沒(méi)有用過(guò)這個(gè)IDE(譯注:本文中的我不代表譯者),它基于Eclipse 平臺(tái)(譯注:請(qǐng)參見(jiàn)www.eclipse.org),它是一個(gè)有著多種功能的插件,我確信這是一個(gè)很好的工具。
editplus.com/ (譯注:editPlus是類似于UltraEdit的文本編輯器)
EditPlus ? 這是替代記事本程序的有效工具,這也是我編輯LUA的工具。它有著多種你所需的功能,而且它有著LUA語(yǔ)言的Schema(譯注:Schema可以理解為一種模板,它規(guī)定者文件如何定義等內(nèi)容)。但是它有著30天的評(píng)估期,你得注冊(cè)擁有它。
這只是3種建議,我認(rèn)為一旦掌握了B:Lua后,你就能夠更好地使用其它工具了。
(2)目標(biāo):WOW文件
你擁有了編輯器后,一切只是剛剛開(kāi)始,我們需要一些工具來(lái)編輯WOW。首選的工具是WinMPQ,下載地址:shadowflare.gameproc.com/dwnload.html#WinMPQ
你需要運(yùn)行庫(kù)(VB4運(yùn)行庫(kù))來(lái)運(yùn)行它(譯注:一般windows都安裝了),有了它你就可以打開(kāi)游戲目錄中的MPQ文件或者M(jìn)oPaO 文件。MPQ是暴雪公司存儲(chǔ)游戲資料的文件格式,如果你有興趣研究的話,請(qǐng)參閱:www.campaigncreations.org/starcraft/inside_mopaq/index.htm
有了WinMPQ,你就可以解開(kāi)文件內(nèi)容,并且打包到游戲安裝目錄。
了WinMPQ,你就可以解開(kāi)文件內(nèi)容,并且打包到游戲安裝目錄,里面就是你所需的所有內(nèi)容。Interface.mpq文件里面有基本的界面數(shù)據(jù),并且有著大量柯作為例子的文件。Patch.mpq文件里有著所有的補(bǔ)丁內(nèi)容,在游戲運(yùn)行時(shí)將覆蓋所有基礎(chǔ)的文件。
打開(kāi)WinMpq,我們將所有基礎(chǔ)界面文件作為例子來(lái)使用。下面還將示范如何保證數(shù)據(jù)與最新的補(bǔ)丁保持一致。使用“Open”選項(xiàng)打開(kāi)interface.mpq文件(該文件在游戲安裝目錄下),找到一個(gè)叫FrameXML的文件夾(還有一個(gè)叫g(shù)lueXML的文件夾,不去管它),選中目錄下所有文件并且解壓到游戲安裝以外的目錄下。
同樣,打開(kāi)Patch.mpq,其中不僅僅有界面文件,還有許多更新文件。打開(kāi)Interface\FrameXML目錄,將其中的內(nèi)容解壓到剛才interface.mpq文件的解壓目錄中,并覆蓋已有的文件。這樣我們就有了一份最新的游戲界面FrameXML目錄數(shù)據(jù)作為參考。(你也可以用WinMPQ 解壓其他的文件,例如音樂(lè)文件等)。
2、有了目標(biāo)之后
一切準(zhǔn)備就緒,讓我們開(kāi)始制作第一個(gè)插件吧!
首先你的知道具體文件的安排,哪個(gè)文件是做什么的。讓我們看以下魔獸世界的安裝吧。其中有許多目錄,我們將要操作的目錄是Interface目錄(若不存在請(qǐng)創(chuàng)建)。在該目錄下有3個(gè)主要的目錄:
FrameXML: 有所有暴雪提供的界面,你將打交道的文件都在這。
GlueXML: 包含“游戲之外”的界面,例如登入界面,服務(wù)器選擇,角色創(chuàng)建等。你不太需要關(guān)心這些文件。
AddOns: 所有游戲角色的模型。
在AddOns目錄下每個(gè)角色都有其所有的目錄并且有一個(gè)內(nèi)容表。
3、開(kāi)動(dòng)
(1)初始化
我們要開(kāi)始創(chuàng)建“Hello world”啦!(譯注:“Hello world”常指第一個(gè)程序),創(chuàng)建1個(gè)叫hello_world的目錄在AddOns下,即Warcraft/Interface/AddOns/hello_world。在目錄中建立1個(gè)叫hello_world.toc的文件,這就是內(nèi)容表了,它定義了WOW該如何裝載插件內(nèi)容。例如以下就是文件內(nèi)容:
- Interface: 4114
- Title: Hello World
- Notes: The obligatory hello world script ? WoW-style!
- OptionalDeps:
- Dependencies:
- hello_world.xml
作一下解釋,第一行表示新的代碼段的開(kāi)始。事實(shí)上每次暴雪更新補(bǔ)丁后,當(dāng)前的版本號(hào)都會(huì)更新。如果你的腳本沒(méi)有最新的版本號(hào),那么這段腳本將“不會(huì)”裝載入游戲。這就是為什么版本更新導(dǎo)致插件無(wú)法使用的原因。
你可以通過(guò)打開(kāi)Interface\FrameXML\FrameXML.toc文件來(lái)知道當(dāng)前的版本號(hào)。接下來(lái)兩行的Title和Nodes就不必解釋了吧(譯注:分別為標(biāo)題和注解,可選)。在下一行,OptionalDeps中你可以列出所有你的插件的名稱(你可以列出其他插件,用空格分隔)。Dependencies也是同樣的,但它不是可選的,我不太確定如果沒(méi)有這一行你的插件是否會(huì)裝載。最好所有的都寫(xiě),不管它是不是可選的,這樣所有人都能更好閱讀你的代碼。
在開(kāi)始的聲明之后,你將寫(xiě)入一些XML文件的名稱(次序未定),一行寫(xiě)一個(gè)文件的名稱。你也可以將XML文件寫(xiě)在子目錄中,例如“core/hello_world.xml”,這樣能使文件夾里看起來(lái)更簡(jiǎn)潔。
哦。有些復(fù)雜了是么?其他不用管先看
(2)加入內(nèi)容
下面將是最有意思的部分,讓我們從簡(jiǎn)單的開(kāi)始。在目錄中創(chuàng)建hello_world.xml文件(該文件名應(yīng)寫(xiě)在了FrameXML.toc中),內(nèi)容如下(譯注:XML文件格式請(qǐng)尋找有關(guān)文檔):
- <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.blizzard.com/wow/ui/">
- <script file="hello_world.lua"/>
- <!-- Frame to handle all core events -->
- <Frame name="hello_world_core">
- <scripts>
- <onLoad>
- this:RegisterEvent("VARIABLES_LOADED");
- </onLoad>
- <OnEvent>
- if (event == "VARIABLES_LOADED") then
- hello_world_initialize();
- end
- </OnEvent>
- </scripts>
- </Frame>
- </Ui>
(請(qǐng)看wow.nevir.net/tutorial/hello_world/hello_world.xml)
哦。有些復(fù)雜了是么?其他不用管先看<script file="hello_world.lua"/>這一行,它告訴游戲 hello_world.lua 是腳本文件,也就是插件運(yùn)行的腳本所在。每個(gè)界面都用<Frame>的標(biāo)簽(Tag)擴(kuò)起來(lái)。這里我們使用了一個(gè)Frame標(biāo)簽來(lái)簡(jiǎn)單地把所有事件腳本包進(jìn)來(lái),你也可以將所有的界面上的按鈕,窗口等定義在Frame標(biāo)簽里面。在<Frame>標(biāo)簽里,可以定義其一個(gè)叫name的屬性(如:<Frame name="hello_world_core">)
注意里面的值必須在整個(gè)文件里是唯一的。建議你用你的插件模塊名稱作為前綴開(kāi)始,后接下劃線,再接上Frame真正意義的名稱。在上面的例子里,我們把它叫做core,因而組成了上述名字。
在<Frame>標(biāo)簽里有個(gè)<script>標(biāo)簽,其中是真正腳本的內(nèi)容。在這里有許多事件(譯注:即魔獸世界游戲程序在某階段將做的某個(gè)動(dòng)作),其中 <onLoad> 和<OnEvent>是最常用的2個(gè)。
其中<onLoad>是當(dāng)你選擇了角色進(jìn)入游戲時(shí)而角色Laoding畫(huà)面開(kāi)始之前的將響應(yīng)的事件(換句話說(shuō),你的插件在登入畫(huà)面時(shí)是不會(huì)被裝載的)。在我們的代碼中,我們注冊(cè)了this給了一個(gè)叫“VARIABLES_LOADED”的事件(譯注:看不懂代碼的朋友還是先看看一些腳本語(yǔ)言的介紹書(shū)籍),this代表了當(dāng)前的Frame,即這個(gè)名字叫hello_world_core的Frame,this就是指向該Frame的對(duì)象/變量(指向該Frame對(duì)象的實(shí)例),這里的“:”相當(dāng)于引用方法的表達(dá)符(像其他某些腳本語(yǔ)言中的”.” 號(hào)),而RegisterEvent函數(shù)的作用是告訴游戲程序在VARIABLES_LOADED事件發(fā)生時(shí)(VARIABLES_LOADED是游戲內(nèi)定義的事件)通知你定義的Frame。說(shuō)到這里又得說(shuō)說(shuō)<OnEvent>這個(gè)標(biāo)簽了,在其中有一個(gè)默認(rèn)的變量event,它的值就是當(dāng)前游戲里產(chǎn)生的事件的名稱(就好比上面的VARIABLES_LOADED)。
(譯注: 真的是要了解編程的了哦。 這里處理事件就類似Win32處理事件的代碼模式,可以用if(event=事件名稱){操作代碼}else if(event=事件名稱2){操作代碼}…..或者 switch case的方式來(lái)完成。)
現(xiàn)在,暴雪提供了存儲(chǔ)變量的方法,你可以用RegisterForSave(“variable_name”)的方法來(lái)定義一個(gè)變量在游戲過(guò)程中。
在我們的例子中,當(dāng)VARIABLES_LOADED發(fā)生后,將調(diào)用hello_world_initialize()函數(shù)來(lái)處理。對(duì)啦,這個(gè)hello_world_initialize()函數(shù)還沒(méi)定義呢,下面就介紹如何定義函數(shù)。
(3)補(bǔ)完 (譯注:寫(xiě)代碼的部分,會(huì)寫(xiě)腳本的人一定看得懂,不會(huì)寫(xiě)的需要學(xué)習(xí):<)
好了,現(xiàn)在是真正要寫(xiě)代碼的時(shí)候了。創(chuàng)建1個(gè)叫作hello_world.lua的文件。內(nèi)容如下:
- function hello_world_initialize()
- -- add our very first chat command!
- SlashCmdList["HELLOW"] = hello_world_command;
- SLASH_HELLOW1 = "/hellow";
- SLASH_HELLOW2 = "/hw";
- end
- function hello_world_command(msg)
- -- this function handles our chat command
- message(msg);
- end
這里我不想對(duì)語(yǔ)法做出解釋,如果不懂請(qǐng)看LUA的文檔,那里會(huì)詳細(xì)地介紹。參見(jiàn):www.lua.org/manual/5.0/
注意這里系統(tǒng)的I/O 庫(kù)文件,操作系統(tǒng)的庫(kù)文件沒(méi)有包含在魔獸世界UI的PATH路徑之中。至于暴雪定義的函數(shù)(內(nèi)置的)和事件,你可以在Cosmos網(wǎng)站上找到,參閱:www.cosmosui.org/texts/BlizzardCommands.xml
回到代碼,在我們的函數(shù)中,我們定義了1個(gè)聊天用的命令。似乎我們的代碼看起來(lái)挺怪的,是的,我們是直接修改了SlashCmdList這個(gè)表,其作用是當(dāng)我們輸入宏“/hellow 消息” 或者“/hw 消息”是會(huì)調(diào)用hello_world_command()函數(shù),(至于游戲內(nèi)部如何這種關(guān)系做映射不在本文討論范圍內(nèi))然后玩家看到打出“消息”的聊天信息的窗口(譯注:事實(shí)上是msg()函數(shù)創(chuàng)建的窗口)。可以看到“消息”作為參數(shù)傳遞給了hello_world_command()函數(shù)。
以上所有做的就是一個(gè)簡(jiǎn)單的插件,它加入了兩條命令(宏)。如果你想測(cè)試它,進(jìn)入游戲,輸入/console reloadui(重新加載UI),在登入游戲后的聊天框中輸入“/hellow Why hello there!”,你會(huì)看到游戲中彈出一個(gè)消息框,消息是“Why hello there!”。
4、完成
這就是我們基本的例子,以后我可能抽空給出一些其它的例子。
如果你已經(jīng)完成了以上這個(gè)例子,我真是要為你鼓掌了呀!(那花了你不少時(shí)間來(lái)閱讀吧。)
如果你感興趣的話,以下還有不少資料:LUA (www.lua.org/manual/5.0/),暴雪定義的函數(shù)(www.cosmosui.org/texts/BlizzardCommands.xml)。另外,試著看看Interface/FrameXML/BasicControls.xml文件,里面有不少操控語(yǔ)句;還有Font.xml文件,你可以定義自己的字體,顏色等。
小結(jié):LUA學(xué)習(xí)筆記:魔獸世界自定義界面插件的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)能對(duì)你有所幫助!