Lua 脚本怎么样调用外部脚本

在游戏脚本开发中,我们往往会发现脚本量非常大,而且我们经常会在一些核心脚本文件中定义常用的功能函数,但是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
由于代码数量太多不便贴出,如有兴趣,请直接在Git@OSC上获得Lua2Game (VS2013工程)的完整版本!

文章转载自 开源中国社区 [http://www.oschina.net]

时间: 2024-09-20 01:09:24

Lua 脚本怎么样调用外部脚本的相关文章

Lua脚本调用外部脚本_Lua

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脚本文件中的GetRan

Linux/Unix shell 脚本中调用SQL,RMAN脚本

        Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可少的技能之一.本文针对Linux/Unix shell脚本调用sql, rman 脚本给出了相关示例.   一.由shell脚本调用sql,rman脚本 1.shell脚本调用sql脚本 #首先编辑sql文件 oracle@SZDB:~> more dept.sql connect

远程脚本 概述_远程脚本

"实际上,我们自己也曾用过这种方法.这在以前一般称为远程脚本(remote scripting),很多人认为这只是一种修修补补.不过,这确实提供了一种能避免页面刷新的机制. 远程脚本概述 基本说来,远程脚本是一种远程过程调用类型.你可以像正常的Web应用一样与服务器交互,但是不用刷新整个页面.与Ajax类似,你可以调用任何服务器端技术来接收请求.处理请求并返回一个有意义的结果.正如在服务器端有很多选择,客户端同样有许多实现远程脚本的选择.你可以在应用中嵌入Flash动画.Java applet,

急送5分,用户控件中如何调用外部js脚本?

问题描述 <scripttype="text/javascript"src=""></script>像这样在用户控件中引用外部脚本,好像是无效!该怎么写? 解决方案 解决方案二:<scriptlanguage="javascript"type="text/javascript"src="名称.js"></script>我记得是这样子的,好久没搞web了解决方案

unix-Solaris 10 写一个脚本,在atc用户下,调用该脚本,执行poweroff命令

问题描述 Solaris 10 写一个脚本,在atc用户下,调用该脚本,执行poweroff命令 Solaris 10 写一个脚本,在atc用户下,调用该脚本,执行poweroff命令 解决方案 实现一个脚本,然后atc用户执行 解决方案二: 实现一个脚本,然后atc用户执行

引用外部脚本时script标签关闭的写法

在引用外部脚本时,script标签的关闭写法,很多朋友对它保持健忘态度,下面为大家介绍下其正确的写法 在引用外部脚本时,script标签的正确关闭写法如下:   代码如下: <script type="text/javascript" src="js/a.js"></script>    自关闭写法有问题(测试的IE11, chrome 31.0, ff 25.0都不支持):   代码如下: <script type="tex

python-Android程序中如何调用Python脚本

问题描述 Android程序中如何调用Python脚本 如题,需求是要求程序能执行Python中的方法.请注意不是在Android上编写Python程序,目前正在学习jni相关的方法,请有在Android程序中执行脚本文件的相关经验的大牛来指点一二,感激不尽!! 解决方案 C++中调用Python脚本C++中调用Python脚本调用其它python脚本中的函数 解决方案二: http://chenyaqiong81081.blog.163.com/blog/static/446225942007

web-仅在类定义上有 [ScriptService] 特性的 Web 服务才能从脚本中调用。

问题描述 仅在类定义上有 [ScriptService] 特性的 Web 服务才能从脚本中调用. 仅在类定义上有 [ScriptService] 特性的 Web 服务才能从脚本中调用. 解决方案 在.net3.5中,访问web服务,要对web服务添加修饰:[System.Web.Script.Services.ScriptService] 否则,当.ajax()请求服务时,会有异常:只能从脚本中调用在类定义上有[ScriptService]属性的 Web 服务 解决方案二: 在你的方法前面加上[

android网络-android调用python脚本

问题描述 android调用python脚本 请问有没有android调用python脚本的书籍,我有要开发一个恶意网址检测的android应用 解决方案 用C++调用PYTHON脚本python-调用其他的python脚本 解决方案二: 不能直接调用,恶意网址监测,对于监测的工作,你可以放在服务器端(需要服务器)进行处理.