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()
4在C中调用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也很相近。他需要luaSocket和luaFileSystem的支持。
posted on 2008-06-12 22:18
LOGOS 阅读(3760)
评论(2) 编辑 收藏 引用