Lua脚本调用外部脚本

 更新时间:2014年09月22日 12:00:12   投稿:hebedich  
在游戏脚本开发中,我们往往会发现脚本量非常大,而且我们经常会在一些核心脚本文件中定义常用的功能函数,但是Lua脚本没有提供include关键词,那又是怎样调用外部函数的呢?如何实现脚本的Include功能?

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中的模块(module)和包(package)详解

    Lua中的模块(module)和包(package)详解

    这篇文章主要介绍了Lua中的模块(module)和包(package)详解,本文讲解了require函数、写一个模块、package.loaded、module函数等内容,需要的朋友可以参考下
    2014-09-09
  • 实现Lua中数据类型的源码分享

    实现Lua中数据类型的源码分享

    在Lua中有8种基础类型,像其他动态语言一样,在语言中没有类型定义的语法,每个值都携带了它自身的类型信息。下面我们就来尝试通过Lua 5.2.1的源码来看类型的实现
    2015-04-04
  • Lua编程中的一些基本语法整理

    Lua编程中的一些基本语法整理

    这篇文章主要介绍了Lua编程中的一些基本语法整理的相关资料,是Lua入门中最基础的知识,需要的朋友可以参考下
    2015-05-05
  • 浅谈chuck-lua中的多线程

    浅谈chuck-lua中的多线程

    Lua对多线程支持初步体验是本文要介绍的内容,主要是来了解LUA中多线程的使用,,经过反复的实验得到的结果是,lua不支持多线程,如何让它支持?来看本文内容。
    2015-07-07
  • Cocos2d-x中调用Lua及HelloWorld.lua源码分解

    Cocos2d-x中调用Lua及HelloWorld.lua源码分解

    这篇文章主要介绍了Cocos2d-x中调用Lua及HelloWorld.lua源码分解,本文最后总结了一些Lua的语法,需要的朋友可以参考下
    2014-09-09
  • Lua中break语句的使用方法详解

    Lua中break语句的使用方法详解

    这篇文章主要介绍了Lua中break语句的使用方法详解,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Lua中创建全局变量的小技巧(禁止未预期的全局变量)

    Lua中创建全局变量的小技巧(禁止未预期的全局变量)

    这篇文章主要介绍了Lua中创建全局变量的小技巧(禁止未预期的全局变量),使用本文方法可以实现避免创建全局变量,在必须使用全局变量的情况下也给出了实现技巧,需要的朋友可以参考下
    2014-12-12
  • Lua中的闭包小结

    Lua中的闭包小结

    这篇文章主要介绍了Lua中的闭包小结,本文对闭包的概念做了讲解,同时给出闭包代码示例,需要的朋友可以参考下
    2014-09-09
  • Lua和C++语言的交互详解

    Lua和C++语言的交互详解

    这篇文章主要介绍了Lua和C++语言的交互详解,本文讲解了C++和Lua交互,涉及到获取Lua中普通变量的值,Lua中table的值和调用Lua中的函数,需要的朋友可以参考下
    2014-09-09
  • Lua中的类编程代码实例

    Lua中的类编程代码实例

    这篇文章主要介绍了Lua中的类编程代码实例,本文直接用代码讲解类的创建、类的实例化、类的方法调用、类的继承、类的多重继承等面向对象编程方法,需要的朋友可以参考下
    2015-04-04

最新评论