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

标签:
Lua,调用,外部脚本

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
评论“Lua脚本调用外部脚本”
暂无“Lua脚本调用外部脚本”评论...

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。