随笔 - 119  文章 - 290  trackbacks - 0

博客搬家了哦,请移步
叫我abc

常用链接

留言簿(12)

随笔分类

我的博客

搜索

  •  

积分与排名

  • 积分 - 301913
  • 排名 - 84

最新评论

阅读排行榜

1.LUA初始化

lua_State* ls = lua_open();

luaL_loadlibs( ls ); //装载基本环境,推荐

lua_close( ls ); //退出程序时执行

2.装载模块

2.1模块声明

l  模块名称不依赖于文件名

l  在每一个脚本文件内使用module关键字将脚本里的函数和变量纳入特定模块

比如:module( “ui_chat” , package.seeall )

包含了这一句的脚本文件内的函数和变量均属于ui_chat模块

l  不同的脚本文件可以声明为相同的模块,他们会合起来

l  相同文件名的脚本(不同路径)可以声明为不同的模块

l  一个脚本文件内可以写多个module声明,因此它的内容可以归属到多个模块(没有必要这么做,因为跨模块调用非常简单)

2.2入口脚本

不可能将所有模块的装载写入程序,因此要建立一个init.lua脚本,作为装载其他模块的唯一入口。

//为了无差别的处理普通文件和打包文件,不使用luaL_dofile

string buff( “init.lua” );

If ( luaL_dostring( ls , buff.c_str() ) != 0 )

{

         printf( “%s” , lua_tostring( ls , -1 ) );

}

2.3装载所有模块

可以在init.lua中,装载其他模块。装载使用require(path),其中path脚本的路径,比如说

a/b/c,也可以写成a.b.c

require”a/b/c”

require”a.b.c”

模块的装载目录在package.path中指定

 

3模块间相互调用

因为每个模块都注册到全局表下,而全局表所有模块可见。因此调用其他模块的函数的形式就是模块名+函数名。如:

ui_map.build_mark()

4C中调用lua函数

C中调用lua函数十分简单,就是过程有些繁琐。如果打算好好处理的话,还需要注意错误处理。比如要调用ui_main.enter( int  param )

lua_getglobal( ls , “ui_main” )

lua_getfield( ls ,  -1 , “main_enter” );

lua_remove( ls , -2 );

lua_pushnumber( ls , param );

lua_pcall( ls , 1 , 0 ,0 );

相信有很多lua c++wrapper可以更轻易的做到这些事情。

5载入打包文件

lua肯定不知道如何载入我们的打包文件,但是他的require机制提供了一个入口,允许我们定义一个loader,来载入require所请求的文件。

因此载入打包文件的loader大概可以这样实现:通过路径名,从打包文件中读取数据,然后将数据交给loadstring或者loadbuffer

function MyPackLoader( moduleName )

         return loadstring( G_GetPackData( moduleName ) );

end

只要我们将MyPackLoader放进package.loaders即可

6注册C++lua

存在一些lua c++wrapper,可以容易的将程序中的类和函数注册到lua环境中,不过我比较懒,没有尝试这些。

我尝试的是tolua++,一个自动化工具,他可以通过读取定义文件,直接生成类和函数的注册代码。

定义文件可以单独书写,声明需要注册的类和函数。但是我不是很赞成这种方式,因为需要同步真正的头文件和定义文件。

另一种就是可以在头文件中增加特定的注释,标记出需要注册的函数,比如: 

class A : public B { //tolua_export

         //tolua_begin

         void func();

         void func2();

         //tolua_end

}; // tolua_export

由这些tolua_xxx的注释,直接定义了注册区域。

 

>tolua++ -o classbind.cpp class.h

 

PS:tolua++支持继承和虚函数

7debug lua

lua提供了比较完善的debug接口的,包括单步执行、堆栈、变量查看。

为了将这些东西嵌入到自己的程序中,还需要做些工作。

 

简单情况下,我们可以通过debug.sethook监听到函数的调用、函数的返回,以及每一个语句的执行。当我们监听到感兴趣的内容之后,可以进入一个while(true),在这里通过执行lua语句查看感兴趣的内容,像gdb一样。

 

此外,还有两个库可以提供嵌入的debug支持(我没有试验)。

1.         luaEdit,这是一个独立运行的IDE,但是他提供了一个dll,允许我们将他的IDE嵌入到程序中,调试指定的脚本。luaEdit目前尚无远程调试功能

2.         remdebug,这是一个远程调试库,其目的就是为了嵌入其他程序而开发的,调试指令似乎与gdb也很相近。他需要luaSocketluaFileSystem的支持。

posted on 2008-06-12 22:18 LOGOS 阅读(3760) 评论(2)  编辑 收藏 引用

FeedBack:
# re: 使用LUA 2008-06-12 22:27 陈梓瀚(vczh)
直接读代码然后生成注册代码啊……好主意,以后我有空也做一个给我自己的脚本用。一直觉得写C++类的wrapper插件很麻烦。  回复  更多评论
  
# re: 使用LUA 2008-06-18 21:41 李侃
收下了,感谢你,邻居  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理