刚开始弄cocos2d-x 3.x的lua框架。看了很多网上的文章和例子。到最后自己手动写 的时候也遇到很多困难。现在就把这个学习过程记录下来。
首先我看完了 lua脚本在c++的舞步。这篇文章很好,很详细的讲述了c++与lua是如何互相调用的。之后我也看了笨木头的5个例子,简单的实现了一下印证了一些想法。
1)Lua指针的初始化
lua_State* pL =lua_open();
luaL_openlibs(pL);
Lua指针的释放
lua_close(pL);
而在cocos2d-x中 lua_State*被封装在LuaStack对象中,它的构造和析构也执行了相同的调用。不同的地方是它的初始化中所执行的初始化语句更多,包装了更多的绑定相关的内容。
2)lua本身是脚本语言,加载lua本身的时候才会编译。所以,推荐大家在加载文件的时候尽量放在程序的初始化中,因为当你执行luaL_dofile()函数的时候,Lua会启用语法分析器,去分析你的脚本语法是否符合Lua规则,如果你胡乱的传一个文件过去,Lua就会告诉你文件语法错误,无法加载。如果你的Lua脚本很大,函数很多,语法分析器会比较耗时,所以,加载的时候,尽量放在合适的地方。
int nRet =luaL_dofile(_state, fullPath.c_str());
if (nRet !=0)
{
CCLOG("[LUA ERROR] %s",lua_tostring(_state, -1));
lua_pop(_state,1);
return nRet;
}
这一段指明执行完lua文件后返回若非0则出错,lua_tostring从栈中获得错误信息描述,并输出。
说到这里简单借用一下lua的栈描述栈底为1,往栈顶顺序增加。栈顶为-1,往栈底顺序减少。执行文件出错,lua会将出错信息放入栈顶,因此为-1。
3)对lua进行栈操作的常用函数介绍
压入元素到栈里
void lua_pushnil (lua_State *L); void lua_pushboolean (lua_State *L, int bool); void lua_pushnumber (lua_State *L, double n); void lua_pushlstring (lua_State *L, const char *s, size_t length); void lua_pushstring (lua_State *L, const char *s); void lua_pushcfunction (lua_State *L, lua_CFunction fn);
查询栈里的元素
lua_isnil (lua_State *L, int index); lua_isboolean (lua_State *L, int index); int lua_isnumber (lua_State *L, int index); int lua_isstring (lua_State *L, int index); int lua_isfunction (lua_State *L, int index); int lua_istable (lua_State *L, int index); int lua_isuserdata (lua_State *L, int index); lua_islightuserdata (lua_State *L, int index); lua_isthread (lua_State *L, int index);
转换栈里的元素
int lua_toboolean (lua_State *L, int index); double lua_tonumber (lua_State *L, int index); const char * lua_tostring (lua_State *L, int index); const char * lua_tolstring (lua_State *L, int idx, size_t *len); size_t lua_strlen (lua_State *L, int index); lua_CFunction lua_tocfunction (lua_State *L, int