Posted on 2010-05-15 23:23
xyz 阅读(2147)
评论(0) 编辑 收藏 引用 所属分类:
Lua
对lua的使用有初步的了解后,我们稍微增加脚本里函数的复杂元素。
根据lua的教材,lua脚本中的变量除了用local定义外,全部变量都具有全局性,我们来尝试使用全局的特性。
照旧,先修改我们的lua脚本test.lua。
-- test.lua
y=0 --初始化y,不然会提示错误的,因为y的类型未决定
function add(x)
y=y+x
return y
end
上面的脚本很简单,就是对传入的x值进行累加并返回累加后的值
好了~~,上一篇千里之始足中代码可以完全不用修改哦,运行看看。是不是发现总是返回100啊!原因是我们是在button的事件里启用lua后执行完脚本的函数就关闭了,因此我们需要把lua的指针(代码中的L)放到Private中。
private
{ Private declarations }
L: Plua_State;
为了方面我们后续的不断扩展功能,我们把初始化放到一个button1事件中,释放放在另外一个button2中,调用的函数放在另外的button3中。
好,下面是我们分解后的各个button的事件代码。
procedure TForm1.Button1Click(Sender: TObject);
begin
L := lua_open; //初始化
lua_baselibopen(L); //引入lua的基础库函数
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
luaL_loadfile(L, 'test.lua'); //载入lua脚本
lua_resume(L,0); //解析脚本到lua
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
lua_close(L); //释放lua
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
lua_getglobal(L, 'add'); //设置即将要调用的lua脚本函数add
lua_pushnumber(L, 100); //设置参数1=100
if lua_pcall(L, 1, 1,0)<>0 then //调用函数,1个参数,一个返回值 ,函数正确返回0
begin
showmessage(lua_tostring(L,-1)); //错误信息
end
else
showmessage(lua_tostring(L,-1));;//返回的参数
lua_pop(L, 1);
end;
经过以上的改造后,每点击button4时能得到新的累加值。
在一些网站的使用经验中提到,一个L(lua引用)对应一个lua脚本,至于如何使用2个脚本,少有经验提到。一个L可以同时载入2个lua脚本文件吗?或者要用多个L,每个L对应一个lua?载入的2个脚本可以互相调用吗?这些疑问经过我们以下的测试代码后,将得到解释。
新建一个lua脚本,存成test2.lua
--test2.lua
function show()
return y --没声明y是什么类型,单独交易这个脚本是会出错的
end;
准备好脚本后,我们开始修改我们载入脚本的button事件
procedure TForm1.Button2Click(Sender: TObject);
begin
luaL_loadfile(L, 'test.lua'); //载入lua脚本
lua_resume(L,0); //解析脚本到lua
luaL_loadfile(L, 'test2.lua'); //增加载入test2.lua ,www.cnitblog.com/xkz/
lua_resume(L,0);
end;
我们再拖放一个按钮(button5),设置下面的按钮点击事件代码,因为show没有参数,因此是不是我们瞎子摸象中的最开始的例子啊。
procedure TForm1.Button5Click(Sender: TObject);
begin
lua_getglobal(L, 'show'); //设置即将要调用的lua脚本函数add
if lua_pcall(L, 0, 1,0)<>0 then //调用函数,没有参数,一个返回值 ,函数正确返回0
begin
showmessage(lua_tostring(L,-1)); //错误信息
end
else
showmessage(lua_tostring(L,-1));;//返回的参数
end;
执行的结果就是我们执行test2.lua脚本中的show函数,能返回y的值,虽然在test2.lua中并没有给y设置。
因此一个L是可以载入多个lua脚本,并且载入的所有脚本的函数和变量都会在这个L的范围内共享的。
从我们未分解各个步骤到多个button前变量每次都重置看,因此每个L都是独立的,因此2个不同的L载入不同的脚本,他们的函数和变量是不能公用的。
大家可以参照上面的代码建1份L2来验证一下。
到现在如何调用lua中的脚本函数已经基本说完,只有如何变通使用,就要多多学习教材了,特别是lua的一些比较有特色的数据结构和使用方法。