cocos2d-x 3.x中lua调用原理1--从基本的c++与lua互相调用开始

本文详细介绍了cocos2d-x 3.x中使用Lua进行开发时,C++与Lua互相调用的原理。从lua_State初始化、lua文件加载、错误处理、栈操作到全局变量的读写,以及如何执行全局函数,包括传递不同类型的参数。通过实例展示了如何在lua中设置和获取全局变量、表的值,以及调用带有参数的全局函数,强调了lua脚本加载时机和栈管理的重要性。
摘要由CSDN通过智能技术生成

刚开始弄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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值