當前位置:首頁 » 網頁前端 » lua語言腳本的ui
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

lua語言腳本的ui

發布時間: 2023-01-01 13:23:50

⑴ 插件和UI

UI的內容涉及到一些腳本語言和XML文檔的知識,編寫腳本的語言是LUA.
不行,還得轉,要打的字太多了,我給你找個去。

(以下是轉來的)
1.准備開始

A.可以選用的工具

第一步必須明白將要做些什麼,但是為了能夠正確的開始,我們必須選擇一些編寫腳本的工具。我想首先重要的一點是編輯器(用專業術語來說就是IDE-integrated development evironment), 這可能有許多種選擇。由於我們編寫腳本的語言是LUA(譯註:一種腳本語言,參見:http://www.lua.org),我們需要的編輯器應當是針對這種語言的,以下十供選擇的列表:

http://blua.sourceforge.net/ (譯註:sourceforge.net是一個著名的開源項目網站)
B:Lua – 這是首當其充的腳本編輯工具之一,它提供了強大的IDE所提供的功能,足夠用來編輯WOW的UI。而且它是用Java語言編寫的,不論在何種操作系統中尼都能運行它。

http://www.ideais.com.br/luaeclipse/ (譯註:一個運用於Eclipse IDE下的插件,建議使用過Java語言的專業人士使用。)
Lua Eclipse – 這是另外一個Java環境的IDE,我沒有用過這個IDE(譯註:本文中的我不代表譯者),它基於Eclipse 平台(譯註:請參見http://www.eclipse.org),它是一個有著多種功能的插件,我確信這是一個很好的工具。

http://editplus.com/ (譯註:editPlus是類似於UltraEdit的文本編輯器)
EditPlus – 這是替代記事本程序的有效工具,這也是我編輯LUA的工具。它有著多種你所需的功能,而且它有著LUA語言的Schema(譯註:Schema可以理解為一種模板,它規定者文件如何定義等內容)。但是它有著30天的評估期,你得注冊擁有它。

這只是3種建議,我認為一旦掌握了B:Lua後,你就能夠更好地使用其它工具了。

B.目標:WOW文件

你擁有了編輯器後,一切只是剛剛開始,我們需要一些工具來編輯WOW。首選的工具是WinMPQ,下載地址:http://shadowflare.gameproc.com/dwnload.html#WinMPQ
你需要運行庫(VB4運行庫)來運行它(譯註:一般windows都安裝了),有了它你就可以打開游戲目錄中的MPQ文件或者MoPaO 文件。MPQ是暴雪公司存儲游戲資料的文件格式,如果你有興趣研究的話,請參閱:http://www.campaigncreations.org/starcraft/inside_mopaq/index.htm

有了WinMPQ,你就可以解開文件內容,並且打包到游戲安裝目錄。

Interface.mpq文件裡面有基本的界面數據,並且有著大量柯作為例子的文件。Patch.mpq文件里有著所有的補丁內容,在游戲運行時將覆蓋所有基礎的文件。打開WinMpq,我們將所有基礎界面文件作為例子來使用。下面還將示範如何保證數據與最新的補丁保持一致。使用「Open」選項打開interface.mpq文件(該文件在游戲安裝目錄下),找到一個叫FrameXML的文件夾(還有一個叫glueXML的文件夾,不去管它),選中目錄下所有文件並且解壓到游戲安裝以外的目錄下。同樣,打開Patch.mpq,其中不僅僅有界面文件,還有許多更新文件。打開Interface\FrameXML目錄,將其中的內容解壓到剛才interface.mpq文件的解壓目錄中,並覆蓋已有的文件。這樣我們就有了一份最新的游戲界面FrameXML目錄數據作為參考。(你也可以用WinMPQ 解壓其他的文件,例如音樂文件等)。

2.有了目標之後

一切准備就緒,讓我們開始製作第一個插件吧!

首先你的知道具體文件的安排,哪個文件是做什麼的。讓我們看以下魔獸世界的安裝吧。其中有許多目錄,我們將要操作的目錄是Interface目錄(若不存在請創建)。在該目錄下有3個主要的目錄:
FrameXML: 有所有暴雪提供的界面,你將打交道的文件都在這。
GlueXML: 包含「游戲之外」的界面,例如登入界面,伺服器選擇,角色創建等。你不太需要關心這些文件。
AddOns: 所有游戲角色的模型。
在AddOns目錄下每個角色都有其所有的目錄並且有一個內容表。

3.開動!

A.初始化

我們要開始創建「Hello world」啦!(譯註:「Hello world」常指第一個程序),創建1個叫hello_world的目錄在AddOns下,即Warcraft/Interface/AddOns/hello_world。在目錄中建立1個叫hello_world.toc的文件,這就是內容表了,它定義了WOW該如何裝載插件內容。例如以下就是文件內容:
## Interface: 4114
## Title: Hello World
## Notes: The obligatory hello world script – WoW-style!
## OptionalDeps:
## Dependencies:
hello_world.xml
作一下解釋,第一行表示新的代碼段的開始。事實上每次暴雪更新補丁後,當前的版本號都會更新。如果你的腳本沒有最新的版本號,那麼這段腳本將「不會」裝載入游戲。這就是為什麼版本更新導致插件無法使用的原因。你可以通過打開Interface\FrameXML\FrameXML.toc文件來知道當前的版本號。接下來兩行的Title和Nodes就不必解釋了吧(譯註:分別為標題和註解,可選)。在下一行,OptionalDeps中你可以列出所有你的插件的名稱(你可以列出其他插件,用空格分隔)。Dependencies也是同樣的,但它不是可選的,我不太確定如果沒有這一行你的插件是否會裝載。最好所有的都寫,不管它是不是可選的,這樣所有人都能更好閱讀你的代碼。
在開始的聲明之後,你將寫入一些XML文件的名稱(次序未定),一行寫一個文件的名稱。你也可以將XML文件寫在子目錄中,例如「core/hello_world.xml」,這樣能使文件夾里看起來更簡潔。

Interface.mpq文件裡面有基本的界面數據,並且有著大量柯作為例子的文件。Patch.mpq文件里有著所有的補丁內容,在游戲運行時將覆蓋所有基礎的文件。打開WinMpq,我們將所有基礎界面文件作為例子來使用。下面還將示範如何保證數據與最新的補丁保持一致。使用「Open」選項打開interface.mpq文件(該文件在游戲安裝目錄下),找到一個叫FrameXML的文件夾(還有一個叫glueXML的文件夾,不去管它),選中目錄下所有文件並且解壓到游戲安裝以外的目錄下。同樣,打開Patch.mpq,其中不僅僅有界面文件,還有許多更新文件。打開Interface\FrameXML目錄,將其中的內容解壓到剛才interface.mpq文件的解壓目錄中,並覆蓋已有的文件。這樣我們就有了一份最新的游戲界面FrameXML目錄數據作為參考。(你也可以用WinMPQ 解壓其他的文件,例如音樂文件等)。

2.有了目標之後

一切准備就緒,讓我們開始製作第一個插件吧!

首先你的知道具體文件的安排,哪個文件是做什麼的。讓我們看以下魔獸世界的安裝吧。其中有許多目錄,我們將要操作的目錄是Interface目錄(若不存在請創建)。在該目錄下有3個主要的目錄:
FrameXML: 有所有暴雪提供的界面,你將打交道的文件都在這。
GlueXML: 包含「游戲之外」的界面,例如登入界面,伺服器選擇,角色創建等。你不太需要關心這些文件。
AddOns: 所有游戲角色的模型。
在AddOns目錄下每個角色都有其所有的目錄並且有一個內容表。

3.開動!

A.初始化

我們要開始創建「Hello world」啦!(譯註:「Hello world」常指第一個程序),創建1個叫hello_world的目錄在AddOns下,即Warcraft/Interface/AddOns/hello_world。在目錄中建立1個叫hello_world.toc的文件,這就是內容表了,它定義了WOW該如何裝載插件內容。例如以下就是文件內容:
## Interface: 4114
## Title: Hello World
## Notes: The obligatory hello world script – WoW-style!
## OptionalDeps:
## Dependencies:
hello_world.xml
作一下解釋,第一行表示新的代碼段的開始。事實上每次暴雪更新補丁後,當前的版本號都會更新。如果你的腳本沒有最新的版本號,那麼這段腳本將「不會」裝載入游戲。這就是為什麼版本更新導致插件無法使用的原因。你可以通過打開Interface\FrameXML\FrameXML.toc文件來知道當前的版本號。接下來兩行的Title和Nodes就不必解釋了吧(譯註:分別為標題和註解,可選)。在下一行,OptionalDeps中你可以列出所有你的插件的名稱(你可以列出其他插件,用空格分隔)。Dependencies也是同樣的,但它不是可選的,我不太確定如果沒有這一行你的插件是否會裝載。最好所有的都寫,不管它是不是可選的,這樣所有人都能更好閱讀你的代碼。
在開始的聲明之後,你將寫入一些XML文件的名稱(次序未定),一行寫一個文件的名稱。你也可以將XML文件寫在子目錄中,例如「core/hello_world.xml」,這樣能使文件夾里看起來更簡潔。

B.加入內容
下面將是最有意思的部分,讓我們從簡單的開始。在目錄中創建hello_world.xml文件(該文件名應寫在了FrameXML.toc中),內容如下:

<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>

哦。有些復雜了是么?其他不用管先看<Script file="hello_world.lua"/>這一行,它告訴游戲 hello_world.lua 是腳本文件,也就是插件運行的腳本所在。每個界面都用<Frame>的標簽(Tag)擴起來。這里我們使用了一個Frame標簽來簡單地把所有事件腳本包進來,你也可以將所有的界面上的按鈕,窗口等定義在Frame標簽裡面。在<Frame>標簽里,可以定義其一個叫name的屬性(如:<Frame name="hello_world_core">)
注意裡面的值必須在整個文件里是唯一的。建議你用你的插件模塊名稱作為前綴開始,後接下劃線,再接上Frame真正意義的名稱。在上面的例子里,我們把它叫做core,因而組成了上述名字。
在<Frame>標簽里有個<Script>標簽,其中是真正腳本的內容。在這里有許多事件(譯註:即魔獸世界游戲程序在某階段將做的某個動作),其中 <OnLoad> 和<OnEvent>是最常用的2個。其中<OnLoad>是當你選擇了角色進入游戲時而角色Laoding畫面開始之前的將響應的事件(換句話說,你的插件在登入畫面時是不會被裝載的)。在我們的代碼中,我們注冊了this給了一個叫「VARIABLES_LOADED」的事件(譯註:看不懂代碼的朋友還是先看看一些腳本語言的介紹書籍),this代表了當前的Frame,即這個名字叫hello_world_core的Frame,this就是指向該Frame的對象/變數(指向該Frame對象的實例),這里的「:」相當於引用方法的表達符(像其他某些腳本語言中的」.」 號),而RegisterEvent函數的作用是告訴游戲程序在VARIABLES_LOADED事件發生時(VARIABLES_LOADED是游戲內定義的事件)通知你定義的Frame。說到這里又得說說<OnEvent>這個標簽了,在其中有一個默認的變數event,它的值就是當前游戲里產生的事件的名稱(就好比上面的VARIABLES_LOADED)。
(譯註: 真的是要了解編程的了哦。 這里處理事件就類似Win32處理事件的代碼模式,可以用if(event=事件名稱){操作代碼}else if(event=事件名稱2){操作代碼}…..或者 switch case的方式來完成。)
現在,暴雪提供了存儲變數的方法,你可以用RegisterForSave(「variable_name」)的方法來定義一個變數在游戲過程中。
在我們的例子中,當VARIABLES_LOADED發生後,將調用hello_world_initialize()函數來處理。對啦,這個hello_world_initialize()函數還沒定義呢,下面就介紹如何定義函數。

C. 補完 (譯註:寫代碼的部分,會寫腳本的人一定看得懂,不會寫的需要學習:<)

好了,現在是真正要寫代碼的時候了。創建1個叫作hello_world.lua的文件。內容如下:
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

這里我不想對語法做出解釋,如果不懂請看LUA的文檔,那裡會詳細地介紹。參見:http://www.lua.org/manual/5.0/

注意這里系統的I/O 庫文件,操作系統的庫文件沒有包含在魔獸世界UI的PATH路徑之中。至於暴雪定義的函數(內置的)和事件,你可以在Cosmos網站上找到,參閱:http://www.cosmosui.org/texts/BlizzardCommands.xml

回到代碼,在我們的函數中,我們定義了1個聊天用的命令。似乎我們的代碼看起來挺怪的,是的,我們是直接修改了SlashCmdList這個表,其作用是當我們輸入宏「/hellow 消息」 或者「/hw 消息」是會調用hello_world_command()函數,(至於游戲內部如何這種關系做映射不在本文討論范圍內)然後玩家看到打出「消息」的聊天信息的窗口(譯註:事實上是msg()函數創建的窗口)。可以看到「消息」作為參數傳遞給了hello_world_command()函數。

以上所有做的就是一個簡單的插件,它加入了兩條命令(宏)。如果你想測試它,進入游戲,輸入/console reloai(重新載入UI),在登入游戲後的聊天框中輸入「/hellow Why hello there!」,你會看到游戲中彈出一個消息框,消息是「Why hello there!」。

4.完成

(以上是轉來的)

還有不少資料:www.lua.org/manual/5.0/,暴雪定義的函數www.cosmosui.org/texts/BlizzardCommands.xml。另外,試著看看Interface/FrameXML/BasicControls.xml文件,裡面有不少操控語句;還有Font.xml文件,你可以定義自己的字體,顏色等。自己研究吧。

⑵ 怎麼使用lua腳本

LUA腳本語言基本使用方法是本文要將介紹的內容,主要是來學習Lua腳本語言的使用方法,具體內容來看本文詳解。
先要把下邊這些語句加入到VC中的頭文件,一般是加到StdAfx.h中
extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" #pragma comment(lib, "lualib.lib") #pragma comment(lib, "lua.lib") }

然後一般來說都使用一個全局的LUA庫定義的這個東西
lua_State* g_Lua;

並且在工程處初始化時也給LUA初始化
g_Lua = lua_open(); **加這句 /* load Lua base libraries */ 網上一些教材中這么寫的 lua_baselibopen(g_Lua); 不過我這簡單的例子中不用到這些也行 lua_tablibopen(g_Lua); lua_iolibopen(g_Lua); lua_strlibopen(g_Lua); lua_mathlibopen(g_Lua);

緊接著聲明介面函數,注冊上函數
lua_register(g_Lua, "Message", myMessage);

好,初始化部分完了,看看介面函數的寫法。
函數必須這樣的格式來寫
static int Func(lua_State *L) { 靜態型函數,而且必須帶參數為lua_State結構指針 返回的值是代表返回的數據個數,比如return 2;就可以代表 返回兩個整數啊,浮點數什麼的,象LUA的腳本編寫就可以這樣 i, j = Func() , 這樣就表示可以從Func介面函數中得到兩個返回值了 return 0; }

執行腳本語句可以讀文件,也可以直接讀函數名
注冊了
lua_register(g_Lua, "Message", myMessage); static int myMessage(lua_State *L) { OutputDebugString("OK"); return 0; } lua_dofile(g_Lua, strCurPath); //讀文件,必須給出完整的文件路徑名稱 lua_dostring(g_Lua, "Message()"); //直接讀函數

文件中只要寫上
Message()

就可以了。

⑶ Lua 這個腳本語言一般都用來干什麼,有什麼優點

Lua 是 Koreader 的主要編程語言,從控制底層輸入輸出(處理用戶按鍵輸入、手勢識別、控制屏幕刷新),到處理程序應用邏輯都是由它完成。

可以參考一個使用 Lua 和 C/C++ 混合編程的軟體 Koreader(koreader/koreader - GitHub )。Koreader是運行在 Kindle 和 Kobo 閱讀器上的第三方閱讀軟體,支持多種文檔格式。

⑷ LUA如何保存UI界面的配置呢,那又是如何讀取的呢

一般來說 我們會把配置文件寫在INI里,這樣可以給專門做UI的資源部門(我們這里是這么叫的)配置
lua一般依靠宿主語言提供的API來進行相應的讀取,當然,如果是windows lua自己讀取也沒什麼問題
保存的格式 按照默認ini 就OK了
比如
[xxxpanel]
x=100
y=200
類似這樣
讀取的時候用參考MFC就好了,關鍵詞網路MFC讀取ini

⑸ lua腳本語言環境與全局環境以及錯誤處理的理解

2.2 – 環境與全局環境
後面在 §3.2 以及 §3.3.3 會討論, 引用一個叫 var 的自由名字(指在任何層級都未被聲明的名字) 在句法上都被翻譯為 _ENV.var 。 此外,每個被編譯的 Lua 代碼塊都會有一個外部的局部變數叫 _ENV (參見 §3.3.2), 因此,_ENV 這個名字永遠都不會成為一個代碼塊中的自由名字。
在轉譯那些自由名字時,_ENV 是否是那個外部的局部變數無所謂。 _ENV 和其它你可以使用的變數名沒有區別。 這里特別指出,你可以定義一個新變數或指定一個參數叫這個名字。 當編譯器在轉譯自由名字時所用到的 _ENV , 指的是你的程序在那個點上可見的那個名為 _ENV 的變數。 (Lua 的可見性規則參見 §3.5)
被 _ENV 用於值的那張表被稱為 環境。
Lua 保有一個被稱為 全局環境 特別環境。它被保存在 C 注冊表 (參見 §4.5)的一個特別索引下。 在 Lua 中,全局變數 _G 被初始化為這個值。 (_G 不被內部任何地方使用。)
當 Lua 載入一個代碼塊,_ENV 這個上值的默認值就是這個全局環境 (參見 load)。 因此,在默認情況下,Lua 代碼中提及的自由名字都指的全局環境中的相關項 (因此,它們也被稱為 全局變數 )。 此外,所有的標准庫都被載入入全局環境,一些函數也針對這個環境做操作。 你可以用 load (或 loadfile)載入代碼塊,並賦予它們不同的環境。 (在 C 里,當你載入一個代碼塊後,可以通過改變它的第一個上值來改變它的環境。)
2.3 – 錯誤處理
由於 Lua 是一門嵌入式擴展語言,其所有行為均源於宿主程序中 C 代碼對某個 Lua 庫函數的調用。 (單獨使用 Lua 時,lua 程序就是宿主程序。) 所以,在編譯或運行 Lua 代碼塊的過程中,無論何時發生錯誤, 控制權都返回給宿主,由宿主負責採取恰當的措施(比如列印錯誤消息)。
可以在 Lua 代碼中調用 error 函數來顯式地拋出一個錯誤。 如果你需要在 Lua 中捕獲這些錯誤, 可以使用 pcall 或 xpcall 在 保護模式 下調用一個函數。
無論何時出現錯誤,都會拋出一個攜帶錯誤信息的 錯誤對象 (錯誤消息)。 Lua 本身只會為錯誤生成字元串類型的錯誤對象, 但你的程序可以為錯誤生成任何類型的錯誤對象, 這就看你的 Lua 程序或宿主程序如何處理這些錯誤對象。
使用 xpcall 或 lua_pcall 時, 你應該提供一個 消息處理函數 用於錯誤拋出時調用。 該函數需接收原始的錯誤消息,並返回一個新的錯誤消息。 它在錯誤發生後棧尚未展開時調用, 因此可以利用棧來收集更多的信息, 比如通過探知棧來創建一組棧回溯信息。 同時,該處理函數也處於保護模式下,所以該函數內發生的錯誤會再次觸發它(遞歸)。 如果遞歸太深,Lua 會終止調用並返回一個合適的消息。

⑹ lua語言 怎麼獲取用戶對UI多選框選擇

comboBox2.SelectedItem 你這樣是設置comboBox2的默認選定的值 要想得到裡面的值插入資料庫的話 comboBox2.Text 至於資料庫的操作我想你應該會吧

⑺ lua腳本語言的概念解釋

Lua 教程
lua
Lua 是一種輕量小巧的腳本語言,用標准C語言編寫並以源代碼形式開放, 其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定製功能。
Lua 是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)里的一個研究小組於 1993 年開發的,該小組成員有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。
設計目的
其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定製功能。
Lua 特性
輕量級: 他用標准C語言編寫並以源代碼形式開放,編譯後僅僅一百餘K,可以很方便的嵌入別的程序里。
可擴展: Lua提供了非常易於使用的擴展介面和機制:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內置的功能一樣。
其它特性:
支持面向過程(procere-oriented)編程和函數式編程(functional programming);
自動內存管理;只提供了一種通用類型的表(table),用它可以實現數組,哈希表,集合,對象;
語言內置模式匹配;閉包(closure);函數也可以看作一個值;提供多線程(協同進程,並非操作系統所支持的線程)支持;
通過閉包和table可以很方便地支持面向對象編程所需要的一些關鍵機制,比如數據抽象,虛函數,繼承和重載等。
Lua 應用場景
游戲開發
獨立應用腳本
Web 應用腳本
擴展和資料庫插件如:MySQL Proxy 和 MySQL WorkBench
安全系統,如入侵檢測系統
第一個 Lua 程序
接下來我們使用 Lua 來輸出"Hello World!"
實例(Lua 5.3)
print("Hello World!")

⑻ 誰知道WOW的插件,或者說UI介面的大多數是用什麼語言寫的

魔獸世界插件是用Lua腳本語言寫的。
Lua最著名的應用是在暴雪公司的網路游戲WOW中。
Lua腳本可以很容易的被C/C++代碼調用,也可以反過來調用C/C++的函數,這使得Lua在應用程序中可以被廣泛應用。不僅僅作為擴展腳本,也可以作為普通的配置文件,代替XML,Ini等文件格式,並且更容易理解和維護。
Lua由標准C編寫而成,代碼簡潔優美,幾乎在所有操作系統和平台上都可以編譯,運行