當(dāng)前位置:首頁 > 電腦軟件 > 程序源碼 > lua for windows(lua開發(fā)環(huán)境)

lua for windows(lua開發(fā)環(huán)境)

版本:v5.4.6 大?。?73K 語言:簡體中文 類別:程序源碼
  • 類型:國產(chǎn)軟件
  • 授權(quán):免費(fèi)軟件
  • 更新:2023-10-17
  • 環(huán)境:Windows11,Windows10,Windows8,Windows7,WinXP,WinVista
  • 本地下載
9
0% 0%

情介紹

Lua是一個小巧的腳本語言,標(biāo)準(zhǔn) C 編寫而成,它可以被 C/C++ 代碼調(diào)用,也可以反過來調(diào)用 C/C++ 的函數(shù),幾乎在所有操作系統(tǒng)和平臺上都可以編譯、運(yùn)行。Lua 并沒有提供強(qiáng)大的庫,一個完整的 Lua 解釋器不過 200KB,但它在所有腳本引擎中速度是最快的,是作為嵌入式腳本的最佳選擇,這樣更容易讓用戶進(jìn)行理解和維護(hù)。
lua for windows(lua開發(fā)環(huán)境)下載

lua for windows(lua開發(fā)環(huán)境)特性

1、輕量級
輕量級Lua語言的官方版本只包括一個精簡的核心和最基本的庫。這使得Lua體積小、啟動速度快,從而適合嵌入在別的程序里。
2、可擴(kuò)展
可擴(kuò)展 Lua并不象其它許多"大而全"的語言那樣,包括很多功能,比如網(wǎng)絡(luò)通訊、圖形界面等。但是Lua提供了非常易于使用的擴(kuò)展接口和機(jī)制:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內(nèi)置的功能一樣。
3、其它特性
Lua還具有其它一些特性:同時支持面向過程(procedure-oriented)編程和函數(shù)式編程(functional programming);自動內(nèi)存管理;只提供了一種通用類型的表(table),用它可以實(shí)現(xiàn)數(shù)組,哈希表,集合,對象;語言內(nèi)置模式匹配;閉包(closure);函數(shù)也可以看做一個值;提供多線程(協(xié)同進(jìn)程,并非操作系統(tǒng)所支持的線程)支持;通過閉包和table可以很方便地支持面向?qū)ο缶幊趟枰囊恍╆P(guān)鍵機(jī)制,比如數(shù)據(jù)抽象,虛函數(shù),繼承和重載等。

lua應(yīng)用場景

游戲開發(fā)
獨(dú)立應(yīng)用腳本
Web 應(yīng)用腳本
擴(kuò)展和數(shù)據(jù)庫插件如:MySQL Proxy 和 MySQL WorkBench
安全系統(tǒng),如入侵檢測系統(tǒng)

lua示例代碼

是的,你猜對了:Hello,world!
print"Hello,world!"
一個比較復(fù)雜一點(diǎn)的例子,但是它展示了什么是閉包:
function create_a_counter()
local count=0
return function()
count = count + 1
return count
end
end
create_a_counter()返回一個記數(shù)器,每次調(diào)用這個記數(shù)器,都會得到一個比上次大1的值。
注意:調(diào)用的時候,如果你的調(diào)用是這樣的的:
print(create_a_counter())
那么每次輸出是一樣的結(jié)果,沒有計數(shù)的效果,只會輸出計數(shù)器的地址,應(yīng)該這樣調(diào)用:
ct = create_a_counter()
print(ct()) --輸出> 1
print(ct()) --輸出> 2
數(shù)據(jù)交換
介紹
Lua和C程序通過一個棧交換數(shù)據(jù): struct lua_State
棧的序號可以從棧頂和棧底計數(shù),從棧底計數(shù),則棧底是1,向棧頂方向遞增。從棧頂計數(shù),則棧頂是-1,向棧底方向遞減。一般都用從棧底計數(shù)的方式。棧的默認(rèn)大小是20,可以用lua_checkstack修改.用lua_gettop則可以獲得棧里的元素數(shù)目。并不是說在棧頂有一個整形元素。而是計算了一下棧頂元素在棧里的正index,相當(dāng)于元素數(shù)目。
Lua 調(diào)用C函數(shù)用的棧是臨時的,調(diào)用結(jié)束之后就被銷毀了。
如何從棧中獲取從Lua腳本中的參數(shù)
如果知道Lua腳本中某個全局變量的名字,可以用
void lua_getglobal(lua_State *L, const char *name)
這個函數(shù)會將name所指Lua變量的值放在棧頂.
如果是在C 函數(shù)中要獲取Lua調(diào)用函數(shù)使用的參數(shù):
首先用lua_gettop檢查參數(shù)數(shù)量
用lua_is 類函數(shù)檢測參數(shù)的類型,做好錯誤處理
用lua_to 類函數(shù)將參數(shù)轉(zhuǎn)換為number或者string。(對Lua來說,只有這兩種簡單類型)
lua_tonumber返回的是double
lua_tostring返回的是char*
用lua_remove從棧中刪除掉元素
繼續(xù)獲取下一個元素。 因為每次都調(diào)用lua_remove,所以每次調(diào)用lua_tonumber,使用的index都將固定是-1,即棧頂。
如果lua_istable成立,那么說明棧頂是一個table 注意 tabl e是不能取出來的,只能把 table 里的元素一個個取出來。
首先把元素的名字壓入棧頂:
lua_pushstring(L, "i");
然后就可以用lua_gettable調(diào)用,值會放在棧頂。同時剛才壓入的元素名字被彈出。用上面的辦法,可以把這個值取出來。記得也應(yīng)該lua_remove。 如果table的某一個元素也是table,重復(fù)即可。當(dāng)table的所有元素都取完了,記住這個table本身還在棧里,要用lua_remove把它刪除。
如果要獲取的是一個數(shù)組(所謂數(shù)組,其實(shí)就是key是從1開始的數(shù)字序列的table,并且值類型相同),用lua_next可以遍歷這個數(shù)組:
首先lua_pushnil,壓入一個空值,然后
while(lua_next(L, -2)!=0)
{
if(lua_isnumber(L, -1))//判斷元素類型,也可能是string
{
arrf.add((float)lua_tonumber(L, -1));//獲取元素的值
lua_remove(L, -1);
}
}
lua_remove(L,-1);//刪除NIL
如何從C返回數(shù)據(jù)給Lua腳本
用 lua_push 類函數(shù)壓入數(shù)據(jù)到棧中,并用return n;來告訴Lua返回了幾個返回值。 Lua是天生支持多個返回值的,如
x,y = Test()
Lua會根據(jù)n從棧里取相應(yīng)的數(shù)據(jù)。
如果要返回一個table:
lua_newtable(L);//創(chuàng)建一個表格,放在棧頂
lua_pushstring(L,"mydata"); //壓入key
lua_pushnumber(L,66);//壓入value
lua_settable(L,-3);//彈出key,value,并設(shè)置到table里面去
lua_pushstring(L,"subdata");//壓入key
lua_newtable(L);//壓入value,也是一個table
lua_pushstring(L,"mydata"); //壓入subtable的key
lua_pushnumber(L,53);
valuelua_settable(L,-3);//彈出key,value,并設(shè)置到subtable
lua_settable(L,-3);//這時候父table的位置還是-3,彈出key,value(subtable),
//并設(shè)置到table里去
lua_pushstring(L,"mydata2");//同上
lua_pushnumber(L,77);
lua_settable(L,-3);
return1;

//棧里現(xiàn)在就一個table其他都被彈掉了。如果要返回一個數(shù)組,
//用如下代碼:(注意那個關(guān)于trick的注釋,我在等官方的解釋。
//經(jīng)過驗證,這個問題只在windows版本調(diào)用dll中方法的時候出現(xiàn)。WinCE正常)
lua_pushstring(L,"arri");
lua_newtable(L);
{
//atrick:otherwisetheluaenginewillcrash.ThiselementisinvisibleinLuascript
lua_pushnumber(L,-1);
lua_rawseti(L,-2,0);
for(int i=0; i<arri.size(); i++)
{
lua_pushnumber(L, arri);
lua_rawseti(L, -2, i+1);
}
}
lua_settable(L,-3);
這樣產(chǎn)生的數(shù)組可以在Lua中如下遍歷:
for i,v ini pairs(data.arri)
do
print(v)
end
或者是
for i=1,table.getn(data.arri)
do
 print(data.arri)
end
只有數(shù)組才能這樣,name,value構(gòu)成的Record不行,table.getn也只對數(shù)組有效。
由于上述代碼的高度相似性,所以很容易實(shí)現(xiàn)自動生成這些代碼。比如,根據(jù)C的一個struct定義:
typedef enum{BR_9600,BR_4800,}BaudRate;
typedef struct flag
{
intonoff;
intj;
longl;
doubled;
char*name;
BaudRaterate;
}flag;

  可以自動產(chǎn)生如下代碼:
bool DataToLua(flagdata, lua_State*L)
{
lua_newtable(L);
lua_pushstring(L, "onoff");
lua_pushnumber(L, double)data.onoff);
lua_settable(L, -3);
lua_pushstring(L, "j");
lua_pushnumber(L, (double)data.j);
lua_settable(L, -3);
lua_pushstring(L, "l");
lua_pushnumber(L, (double)data.l);
lua_settable(L, -3);
lua_pushstring(L, "d");
lua_pushnumber(L, double)data.d);
lua_settable(L, -3);
lua_pushstring(L, "name");
lua_pushstring(L, data.name.c_str());
lua_settable(L, -3);
lua_pushstring(L, "rate");
lua_pushnumber(L, (double)(int)data.rate);
lua_settable(L, -3);
return true;
}
LuaToData也是類似的。
如果使用面向?qū)ο蟮姆绞椒庋b起flag來,把DataToLua變成flag類的一個方法,就更加方便了。

lua使用項目

Minecraft中的電腦模組(ComputerCraft)
所有的為電腦和turtle(機(jī)器人)的代碼都是基于Lua的,你可以用它們與有(無)線路由器、打印機(jī)、磁盤驅(qū)動器、(黃金)顯示器互動。
Adobe Photoshop Lightroom
Lightroom是Adobe公司的一款攝影后期制作軟件,最開始的版本由Shadowland代碼編寫,后期版本部分使用Lua實(shí)現(xiàn),Lua代碼占到代碼總量的63%。
金庸群俠傳lua復(fù)刻版
這個游戲,游戲迷們想必都玩過了。牛人用lua腳本重新弄了下。
魔獸世界
他的插件用的也是lua。
仙劍奇?zhèn)b傳五
解壓游戲到資源目錄可以看到游戲到腳本全部是使用Lua語言編寫的。
Garry's Mod
這個游戲的所有創(chuàng)意工坊插件都是由LUA腳本編寫的。
Don't Starve(饑荒)
Klei 開發(fā)的一款動作冒險類求生游戲,于2013年4月23日在PC上發(fā)行。游戲及所有創(chuàng)意工坊插件都是由LUA腳本編寫的。

載地址

  • 電腦版
lua for windows(lua開發(fā)環(huán)境) v5.4.6官方版

網(wǎng)友評論

0條評論
(您的評論需要經(jīng)過審核才能顯示)