我的一片天

我的一片天
posts - 27, comments - 12, trackbacks - 0, articles - 16
   :: 首页 :: 新随笔 :: 联系 ::  :: 管理

Lua新手上路之小试牛刀(DELPHI)

Posted on 2010-05-15 23:23 xyz 阅读(2044) 评论(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的一些比较有特色的数据结构和使用方法。

只有注册用户登录后才能发表评论。