当前位置: 移动技术网 > IT编程>脚本编程>Lua > Lua脚本调用外部脚本

Lua脚本调用外部脚本

2017年12月08日  | 移动技术网IT编程  | 我要评论
test.lua脚本定义main函数如下: function main(szname, num1, num2) print("main()", szn

test.lua脚本定义main函数如下:

function main(szname, num1, num2)   
  print("main()", szname, num1, num2); 
  local nrandmax = 10000;  
  local nrand = math.random(nrandmax); 
  print("nrand =", nrand) 
  return 1; 
end

现在我想在test.lua脚本中调用另外一个test1.lua脚本文件中的getrandmax(),通常的做法是这样的:

function main(szname, num1, num2)   
  print("main()", szname, num1, num2); 
  dofile("test1.lua")   --加载并编译运行脚本 
  local nrandmax = getrandmax();  
  local nrand = math.random(nrandmax); 
  print("nrand =", nrand) 
  return 1; 
end

看上去是这样的,非常简单,通过dofile对test1.lua文件进行加载并编译运行,这部操作会将test1.lua文件中的函数和变量压入全局的虚拟栈中,这样就可以实现对getrandmax()调用。但是这里有个问题:dofile函数接受的是需要引用的外部脚本的路径,如果多次调用会不胜其烦,而且效率不高。可能有人谁说,那我们直接把dofile作为全局函数执行,就像这样:

dofile("test1.lua") 
dofile("test2.lua") 
dofile("test3.lua") 
 
function main(szname, num1, num2)   
  print("main()", szname, num1, num2); 
  local nrandmax = getrandmax();  --调用test1.lua中的函数 
  local nrand = math.random(nrandmax); 
  print("nrand =", nrand) 
  return 1; 
end

这样做是可以的,但是仍然有些问题:

    1,如果test.lua文件dofile(test1.lua),而test1.lua文件dofile(test.lua),怎么办!出现循环应用,执行后堆栈溢出;

复制代码 代码如下:

test.lua:5: too many c levels (limit is 200) in function at line 5 near '"main()"'

    2,dofile的路径问题,每次都要传入文件的绝对路径,如果路径不正确,无法正常执行,这也是个很烦的事。

复制代码 代码如下:

cannot open \script\test.lua: no such file or directory

那怎样做才更好呢?既然dofile有这些的问题,我们就把这些问题解决。在c/c++中实现include脚本接口函数,在脚本中作为全局函数调用,实现外部脚本文件包含功能。

//脚本接口 tlua_funcs g_gamefunc[] = { 
  { "include",        luainclude }, 
  { "reloadallscript",    luareloadallscript}, 
  { "sayhello",       luasayhello }, 
  { "stopgame",       luastopgame }, 
};

在include函数中使用set集合避免重复包含的问题,获取当前的执行路径拼接成绝对路径,这样就省了不少事;)

include("\\script\\test1.lua") --include脚本接口 
 
function main(szname, num1, num2)   
  print("main()", szname, num1, num2); 
  local nrandmax = getrandmax();  --调用test1.lua中的函数 
  local nrand = math.random(nrandmax); 
  print("nrand =", nrand) 
  return 1; 
end

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网