Lua腳本調(diào)用外部腳本
test.lua腳本定義main函數(shù)如下:
function main(szName, num1, num2) print("main()", szName, num1, num2); local nRandMax = 10000; local nRand = math.random(nRandMax); print("nRand =", nRand) return 1; end
現(xiàn)在我想在test.lua腳本中調(diào)用另外一個(gè)test1.lua腳本文件中的GetRandMax(),通常的做法是這樣的:
function main(szName, num1, num2) print("main()", szName, num1, num2); dofile("test1.lua") --加載并編譯運(yùn)行腳本 local nRandMax = GetRandMax(); local nRand = math.random(nRandMax); print("nRand =", nRand) return 1; end
看上去是這樣的,非常簡單,通過dofile對test1.lua文件進(jìn)行加載并編譯運(yùn)行,這部操作會將test1.lua文件中的函數(shù)和變量壓入全局的虛擬棧中,這樣就可以實(shí)現(xiàn)對GetRandMax()調(diào)用。但是這里有個(gè)問題:dofile函數(shù)接受的是需要引用的外部腳本的路徑,如果多次調(diào)用會不勝其煩,而且效率不高。可能有人誰說,那我們直接把dofile作為全局函數(shù)執(zhí)行,就像這樣:
dofile("test1.lua") dofile("test2.lua") dofile("test3.lua") function main(szName, num1, num2) print("main()", szName, num1, num2); local nRandMax = GetRandMax(); --調(diào)用test1.lua中的函數(shù) local nRand = math.random(nRandMax); print("nRand =", nRand) return 1; end
這樣做是可以的,但是仍然有些問題:
1,如果test.lua文件dofile(test1.lua),而test1.lua文件dofile(test.lua),怎么辦!出現(xiàn)循環(huán)應(yīng)用,執(zhí)行后堆棧溢出;
test.lua:5: too many C levels (limit is 200) in function at line 5 near '"main()"'
2,dofile的路徑問題,每次都要傳入文件的絕對路徑,如果路徑不正確,無法正常執(zhí)行,這也是個(gè)很煩的事。
cannot open \script\test.lua: No such file or directory
那怎樣做才更好呢?既然dofile有這些的問題,我們就把這些問題解決。在C/C++中實(shí)現(xiàn)Include腳本接口函數(shù),在腳本中作為全局函數(shù)調(diào)用,實(shí)現(xiàn)外部腳本文件包含功能。
//腳本接口 TLua_Funcs g_GameFunc[] = { { "Include", LuaInclude }, { "ReloadAllScript", LuaReloadAllScript}, { "SayHello", LuaSayHello }, { "StopGame", LuaStopGame }, };
在Include函數(shù)中使用set集合避免重復(fù)包含的問題,獲取當(dāng)前的執(zhí)行路徑拼接成絕對路徑,這樣就省了不少事;)
Include("\\script\\test1.lua") --Include腳本接口 function main(szName, num1, num2) print("main()", szName, num1, num2); local nRandMax = GetRandMax(); --調(diào)用test1.lua中的函數(shù) local nRand = math.random(nRandMax); print("nRand =", nRand) return 1; end
相關(guān)文章
lua獲取未來某時(shí)間點(diǎn)的時(shí)間戳解決方案
這篇文章主要介紹了lua獲取未來某時(shí)間點(diǎn)的時(shí)間戳解決方案,需要的朋友可以參考下2014-12-12