cocos2dx-Lua学习笔记:CCLuaStack

前端之家收集整理的这篇文章主要介绍了cocos2dx-Lua学习笔记:CCLuaStack前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

备注:

1 作者对于Lua的使用较少,纯粹从使用出发,对它的理解较浅,可能有错误,还请路过的各位大牛多多指正。
2 本笔记代码部分参考cocos2dx2.2.3代码代码版权归原作者所有。
3 由于作者时间,经验,能力有限,笔记可能不完整,以后随用随补充吧。

CCLuaStack代码较多,里面实现了大部分Lua与C++代码的交互细节,这里一点点的笔记吧。

lua_print:

打印栈中的所有的内容。参考网址如下:【 http://cstriker1407.info/blog/lua-basic-notes-stack/

@H_403_24@
namespace {
@H_403_24@
int lua_print(lua_State * luastate)
@H_403_24@
{
@H_403_24@
int nargs = lua_gettop(luastate);
@H_403_24@
@H_403_24@
std::string t;
@H_403_24@
for (int i=1; i <= nargs; i++)
@H_403_24@
{
@H_403_24@
if (lua_istable(luastate,i))
@H_403_24@
t += "table";
@H_403_24@
else if (lua_isnone(luastate,i))
@H_403_24@
t += "none";
@H_403_24@
else if (lua_isnil(luastate,i))
@H_403_24@
t += "nil";
@H_403_24@
else if (lua_isboolean(luastate,i))
@H_403_24@
{
@H_403_24@
if (lua_toboolean(luastate,i) != 0)
@H_403_24@
t += "true";
@H_403_24@
else
@H_403_24@
t += "false";
@H_403_24@
}
@H_403_24@
else if (lua_isfunction(luastate,i))
@H_403_24@
t += "function";
@H_403_24@
else if (lua_islightuserdata(luastate,i))
@H_403_24@
t += "lightuserdata";
@H_403_24@
else if (lua_isthread(luastate,i))
@H_403_24@
t += "thread";
@H_403_24@
else
@H_403_24@
{
@H_403_24@
const char * str = lua_tostring(luastate,i);
@H_403_24@
if (str)
@H_403_24@
t += lua_tostring(luastate,i);
@H_403_24@
else
@H_403_24@
t += lua_typename(luastate,lua_type(luastate,i));
@H_403_24@
}
@H_403_24@
if (i!=nargs)
@H_403_24@
t += "\t";
@H_403_24@
}
@H_403_24@
CCLOG("[LUA-print] %s",t.c_str());
@H_403_24@
@H_403_24@
return 0;
@H_403_24@
}
@H_403_24@
} // namespace {

创建与初始化:

代码虽然很简短,但是函数调用很多。这里先笔记下最上层的函数调用,底层的函数实现分别笔记。

@H_403_24@
//创建一个新的lua运行环境
@H_403_24@
CCLuaStack *CCLuaStack::create(void)
@H_403_24@
{
@H_403_24@
CCLuaStack *stack = new CCLuaStack();
@H_403_24@
stack->init();
@H_403_24@
stack->autorelease();
@H_403_24@
return stack;
@H_403_24@
}
@H_403_24@
//将一个已有的lua运行环境附到一个新的LuaStacck上。
@H_403_24@
CCLuaStack *CCLuaStack::attach(lua_State *L)
@H_403_24@
{
@H_403_24@
CCLuaStack *stack = new CCLuaStack();
@H_403_24@
stack->initWithLuaState(L);
@H_403_24@
stack->autorelease();
@H_403_24@
return stack;
@H_403_24@
}
@H_403_24@
@H_403_24@
//初始化一个新的lua运行环境
@H_403_24@
bool CCLuaStack::init(void)
@H_403_24@
{
@H_403_24@
m_state = lua_open(); //新建一个lua环境
@H_403_24@
luaL_openlibs(m_state); //将lua标准库注册到lua环境中
@H_403_24@
tolua_Cocos2d_open(m_state); //将cocos2dx的函数注册到lua环境中,后续笔记
@H_403_24@
toluafix_open(m_state);
@H_403_24@
@H_403_24@
// Register our version of the global "print" function
@H_403_24@
const luaL_reg global_functions [] = {
@H_403_24@
{"print",lua_print},
@H_403_24@
{NULL,NULL}
@H_403_24@
};
@H_403_24@
luaL_register(m_state,"_G",global_functions); //将自定义的print函数注册到全局table中,后续笔记
@H_403_24@
tolua_CocoStudio_open(m_state); //将cocosstudio函数注册到lua环境中,后续笔记
@H_403_24@
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC)
@H_403_24@
CCLuaObjcBridge::luaopen_luaoc(m_state);
@H_403_24@
#endif
@H_403_24@
//将剩余的一些函数和变量注册到lua环境中,后续笔记
@H_403_24@
register_all_cocos2dx_manual(m_state);
@H_403_24@
register_all_cocos2dx_extension_manual(m_state);
@H_403_24@
register_all_cocos2dx_studio_manual(m_state);
@H_403_24@
// add cocos2dx loader
@H_403_24@
addLuaLoader(cocos2dx_lua_loader);
@H_403_24@
@H_403_24@
return true;
@H_403_24@
}
@H_403_24@
@H_403_24@
//将一个已有的lua运行环境附到本LuaStack上,直接赋值即可。
@H_403_24@
bool CCLuaStack::initWithLuaState(lua_State *L)
@H_403_24@
{
@H_403_24@
m_state = L;
@H_403_24@
return true;
@H_403_24@
}

修改变量package[“path”]:

将新的lua文件路径添加到Lua保存的路径中。参考网址如下:【http://cstriker1407.info/blog/lua-basic-notes-stack-variable-exchange/

@H_403_24@
void CCLuaStack::addSearchPath(const char* path)
@H_403_24@
{
@H_403_24@
lua_getglobal(m_state,"package"); /* L: package */
@H_403_24@
lua_getfield(m_state,-1,"path"); /* get package.path,L: package path */
@H_403_24@
const char* cur_path = lua_tostring(m_state,-1);
@H_403_24@
lua_pushfstring(m_state,"%s;%s/?.lua",cur_path,path); /* L: package path newpath */
@H_403_24@
lua_setfield(m_state,-3,"path"); /* package.path = newpath,L: package path */
@H_403_24@
lua_pop(m_state,2); /* L: - */
@H_403_24@
}

addLuaLoader:

自定义的loader方法添加到Lua环境中。

@H_403_24@
void CCLuaStack::addLuaLoader(lua_CFunction func)
@H_403_24@
{
@H_403_24@
if (!func) return;
@H_403_24@
@H_403_24@
// stack content after the invoking of the function
@H_403_24@
// get loader table
@H_403_24@
lua_getglobal(m_state,"loaders"); /* L: package,loaders */
@H_403_24@
@H_403_24@
// insert loader into index 2
@H_403_24@
lua_pushcfunction(m_state,func); /* L: package,loaders,func */
@H_403_24@
for (int i = lua_objlen(m_state,-2) + 1; i > 2; --i)
@H_403_24@
{
@H_403_24@
lua_rawgeti(m_state,-2,i - 1); /* L: package,func,function */
@H_403_24@
// we call lua_rawgeti,so the loader table now is at -3
@H_403_24@
lua_rawseti(m_state,i); /* L: package,func */
@H_403_24@
}
@H_403_24@
lua_rawseti(m_state,2); /* L: package,loaders */
@H_403_24@
@H_403_24@
// set loaders into package
@H_403_24@
lua_setfield(m_state,"loaders"); /* L: package */
@H_403_24@
@H_403_24@
lua_pop(m_state,1);
@H_403_24@
}

在Lua中删掉与某个Object有关的注册信息:

@H_403_24@
void CCLuaStack::removeScriptObjectByCCObject(CCObject* pObj)
@H_403_24@
{
@H_403_24@
toluafix_remove_ccobject_by_refid(m_state,pObj->m_nLuaID);
@H_403_24@
}
@H_403_24@
@H_403_24@
void CCLuaStack::removeScriptHandler(int nHandler)
@H_403_24@
{
@H_403_24@
toluafix_remove_function_by_refid(m_state,nHandler);
@H_403_24@
}

在C中调用Lua脚本:

参考网址如下:【 http://cstriker1407.info/blog/lua-basic-notes-c-call-lua/

@H_403_24@
//执行Lua脚本字符串
@H_403_24@
int CCLuaStack::executeString(const char *codes)
@H_403_24@
{
@H_403_24@
//首先把字符串载入到Lua环境中
@H_403_24@
luaL_loadstring(m_state,codes);
@H_403_24@
return executeFunction(0);//以0个入参执行该脚本。
@H_403_24@
}
@H_403_24@
@H_403_24@
//执行Lua脚本文件
@H_403_24@
int CCLuaStack::executeScriptFile(const char* filename)
@H_403_24@
{
@H_403_24@
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
@H_403_24@
std::string code("require \"");
@H_403_24@
code.append(filename);
@H_403_24@
code.append("\"");
@H_403_24@
return executeString(code.c_str());
@H_403_24@
#else
@H_403_24@
//首先根据文件名找到文件绝对路径
@H_403_24@
std::string fullPath = CCFileUtils::sharedFileUtils()->fullPathForFilename(filename);
@H_403_24@
++m_callFromLua;
@H_403_24@
//执行该文件
@H_403_24@
int nRet = luaL_dofile(m_state,fullPath.c_str());
@H_403_24@
--m_callFromLua;
@H_403_24@
//通过对m_callFromLua的判断,来确认lua脚本是正常执行完毕的。
@H_403_24@
CC_ASSERT(m_callFromLua >= 0);
@H_403_24@
// lua_gc(m_state,LUA_GCCOLLECT,0);
@H_403_24@
@H_403_24@
if (nRet != 0)
@H_403_24@
{//如果lua脚本文件错误,这里把错误放到栈顶,这里打印出来。
@H_403_24@
CCLOG("[LUA ERROR] %s",lua_tostring(m_state,-1));
@H_403_24@
lua_pop(m_state,1);//弹出栈顶的错误信息,保证栈恢复到以前。
@H_403_24@
return nRet;
@H_403_24@
}
@H_403_24@
//执行成功,忽略掉脚本返回值,直接返回0
@H_403_24@
return 0;
@H_403_24@
#endif
@H_403_24@
}
@H_403_24@
//执行注册在Lua环境中的函数
@H_403_24@
int CCLuaStack::executeGlobalFunction(const char* functionName)
@H_403_24@
{
@H_403_24@
//首先在Lua环境中找到该函数,如果找到了,那么该函数会放到栈顶
@H_403_24@
lua_getglobal(m_state,functionName); /* query function by name,stack: function */
@H_403_24@
if (!lua_isfunction(m_state,-1))
@H_403_24@
{//如果栈顶不是函数,说明没有找到,直接日志,清理栈,返回。
@H_403_24@
CCLOG("[LUA ERROR] name '%s' does not represent a Lua function",functionName);
@H_403_24@
lua_pop(m_state,1);
@H_403_24@
return 0;
@H_403_24@
}
@H_403_24@
//找到了,执行
@H_403_24@
return executeFunction(0);
@H_403_24@
}
@H_403_24@
@H_403_24@
//执行函数,默认此时栈已经OK,即函数被先压栈,参数以正序压栈,
@H_403_24@
//numArgs表示入参的数量
@H_403_24@
int CCLuaStack::executeFunction(int numArgs)
@H_403_24@
{
@H_403_24@
//根据入参的数量获取函数在栈中的位置
@H_403_24@
int functionIndex = -(numArgs + 1);
@H_403_24@
if (!lua_isfunction(m_state,functionIndex))//检查该位置是否是函数
@H_403_24@
{
@H_403_24@
//不是,直接返回,并且清理栈
@H_403_24@
CCLOG("value at stack [%d] is not function",functionIndex);
@H_403_24@
lua_pop(m_state,numArgs + 1); // remove function and arguments
@H_403_24@
return 0;
@H_403_24@
}
@H_403_24@
@H_403_24@
//在Lua环境中找到函数__G__TRACKBACK__
@H_403_24@
int traceback = 0;
@H_403_24@
lua_getglobal(m_state,"__G__TRACKBACK__"); /* L: ... func arg1 arg2 ... G */
@H_403_24@
if (!lua_isfunction(m_state,-1))
@H_403_24@
{//如果没有找到__G__TRACKBACK__,那么就把栈顶清理掉
@H_403_24@
lua_pop(m_state,1); /* L: ... func arg1 arg2 ... */
@H_403_24@
}
@H_403_24@
else
@H_403_24@
{//找到了,就把__G__TRACKBACK__向后放,放到func后面
@H_403_24@
lua_insert(m_state,functionIndex - 1); /* L: ... G func arg1 arg2 ... */
@H_403_24@
traceback = functionIndex - 1;
@H_403_24@
}
@H_403_24@
@H_403_24@
int error = 0;
@H_403_24@
++m_callFromLua;
@H_403_24@
//调用lua_pcall,注意这里设置了1个返回值,而且设置了错误处理函数索引traceback
@H_403_24@
error = lua_pcall(m_state,numArgs,1,traceback); /* L: ... [G] ret */
@H_403_24@
--m_callFromLua;
@H_403_24@
if (error)
@H_403_24@
{
@H_403_24@
//如果有错误,那么根据是否有traceback函数来清理栈
@H_403_24@
if (traceback == 0)
@H_403_24@
{
@H_403_24@
CCLOG("[LUA ERROR] %s",- 1)); /* L: ... error */
@H_403_24@
lua_pop(m_state,1); // remove error message from stack
@H_403_24@
}
@H_403_24@
else /* L: ... G error */
@H_403_24@
{
@H_403_24@
lua_pop(m_state,2); // remove __G__TRACKBACK__ and error message from stack
@H_403_24@
}
@H_403_24@
return 0;
@H_403_24@
}
@H_403_24@
//没有错误,就处理返回值
@H_403_24@
// get return value
@H_403_24@
int ret = 0;
@H_403_24@
if (lua_isnumber(m_state,-1))
@H_403_24@
{
@H_403_24@
ret = lua_tointeger(m_state,-1);
@H_403_24@
}
@H_403_24@
else if (lua_isboolean(m_state,-1))
@H_403_24@
{
@H_403_24@
ret = lua_toboolean(m_state,-1);
@H_403_24@
}
@H_403_24@
// remove return value from stack
@H_403_24@
lua_pop(m_state,1); /* L: ... [G] */
@H_403_24@
@H_403_24@
//如果有错误处理函数,在弹一次栈。使栈回复原样。
@H_403_24@
if (traceback)
@H_403_24@
{
@H_403_24@
lua_pop(m_state,1); // remove __G__TRACKBACK__ from stack /* L: ... */
@H_403_24@
}
@H_403_24@
//返回 函数的返回值
@H_403_24@
return ret;
@H_403_24@
}
@H_403_24@
//根据注册函数的ID执行该函数
@H_403_24@
int CCLuaStack::executeFunctionByHandler(int nHandler,int numArgs)
@H_403_24@
{
@H_403_24@
int ret = 0;
@H_403_24@
//首先在Lua环境中找到这个函数
@H_403_24@
if (pushFunctionByHandler(nHandler)) /* L: ... arg1 arg2 ... func */
@H_403_24@
{
@H_403_24@
//找到之后,把该函数在栈中的位置调到入参下面,以便符合函数执行的要求
@H_403_24@
if (numArgs > 0)
@H_403_24@
{
@H_403_24@
lua_insert(m_state,-(numArgs + 1)); /* L: ... func arg1 arg2 ... */
@H_403_24@
}
@H_403_24@
//执行函数
@H_403_24@
ret = executeFunction(numArgs);
@H_403_24@
}
@H_403_24@
//清理栈,并返回结果
@H_403_24@
lua_settop(m_state,0);
@H_403_24@
return ret;
@H_403_24@
}
@H_403_24@
//人工产生一个错误信息
@H_403_24@
bool CCLuaStack::handleAssert(const char *msg)
@H_403_24@
{
@H_403_24@
if (m_callFromLua == 0) return false;
@H_403_24@
//将错误信息放到栈顶
@H_403_24@
lua_pushfstring(m_state,"ASSERT Failed ON LUA EXECUTE: %s",msg ? msg : "unknown");
@H_403_24@
//人工产生一个Lua错误
@H_403_24@
lua_error(m_state);
@H_403_24@
return true;
@H_403_24@
}
@H_403_24@
@H_403_24@
int CCLuaStack::reallocateScriptHandler(int nHandler)
@H_403_24@
{
@H_403_24@
LUA_FUNCTION nNewHandle = -1;
@H_403_24@
@H_403_24@
if (pushFunctionByHandler(nHandler))
@H_403_24@
{
@H_403_24@
nNewHandle = toluafix_ref_function(m_state,lua_gettop(m_state),0);
@H_403_24@
}
@H_403_24@
/*
@H_403_24@
toluafix_get_function_by_refid(m_state,nNewHandle);
@H_403_24@
if (!lua_isfunction(m_state,-1))
@H_403_24@
{
@H_403_24@
CCLOG("Error!");
@H_403_24@
}
@H_403_24@
lua_settop(m_state,0);
@H_403_24@
*/
@H_403_24@
return nNewHandle;
@H_403_24@
@H_403_24@
}
@H_403_24@
//和executeFunction类似,不过这里的Lua函数会返回多个值。这里用pResultArray来保存返回值。
@H_403_24@
int CCLuaStack::executeFunctionReturnArray(int nHandler,int nNumArgs,int nNummResults,CCArray* pResultArray)
@H_403_24@
{
@H_403_24@
if (NULL == pResultArray)
@H_403_24@
return 0;
@H_403_24@
//首先在Lua环境中找到这个函数
@H_403_24@
if (pushFunctionByHandler(nHandler)) /* L: ... arg1 arg2 ... func */
@H_403_24@
{
@H_403_24@
if (nNumArgs > 0)
@H_403_24@
{
@H_403_24@
//调整栈的顺序,以符合Lua的调用规则
@H_403_24@
lua_insert(m_state,-(nNumArgs + 1)); /* L: ... func arg1 arg2 ... */
@H_403_24@
int functionIndex = -(nNumArgs + 1);
@H_403_24@
if (!lua_isfunction(m_state,functionIndex))
@H_403_24@
{
@H_403_24@
CCLOG("value at stack [%d] is not function",functionIndex);
@H_403_24@
lua_pop(m_state,nNumArgs + 1); // remove function and arguments
@H_403_24@
return 0;
@H_403_24@
}
@H_403_24@
@H_403_24@
//获取错误处理函数
@H_403_24@
int traceback = 0;
@H_403_24@
lua_getglobal(m_state,"__G__TRACKBACK__"); /* L: ... func arg1 arg2 ... G */
@H_403_24@
if (!lua_isfunction(m_state,-1))
@H_403_24@
{
@H_403_24@
lua_pop(m_state,1); /* L: ... func arg1 arg2 ... */
@H_403_24@
}
@H_403_24@
else
@H_403_24@
{
@H_403_24@
lua_insert(m_state,functionIndex - 1); /* L: ... G func arg1 arg2 ... */
@H_403_24@
traceback = functionIndex - 1;
@H_403_24@
}
@H_403_24@
@H_403_24@
int error = 0;
@H_403_24@
++m_callFromLua;
@H_403_24@
//执行函数调用,这里设置了需要返回nNummResults个返回值
@H_403_24@
error = lua_pcall(m_state,nNumArgs,nNummResults,traceback); /* L: ... [G] ret1 ret2 ... retResults*/
@H_403_24@
--m_callFromLua;
@H_403_24@
if (error)
@H_403_24@
{
@H_403_24@
//有错误则进行错误处理
@H_403_24@
if (traceback == 0)
@H_403_24@
{
@H_403_24@
CCLOG("[LUA ERROR] %s",- 1)); /* L: ... error */
@H_403_24@
lua_pop(m_state,1); // remove error message from stack
@H_403_24@
}
@H_403_24@
else /* L: ... G error */
@H_403_24@
{
@H_403_24@
lua_pop(m_state,2); // remove __G__TRACKBACK__ and error message from stack
@H_403_24@
}
@H_403_24@
return 0;
@H_403_24@
}
@H_403_24@
@H_403_24@
// get return value,don't pass LUA_MULTRET to numResults,
@H_403_24@
if (nNummResults <= 0) return 0; //执行完毕,查询获取返回值,并吧返回值加到pResultArray中。
@H_403_24@
for (int i = 0 ; i < nNummResults; i++) { if (lua_type(m_state,-1) == LUA_TBOOLEAN) { bool value = lua_toboolean(m_state,-1); pResultArray->addObject(CCBool::create(value)) ;
@H_403_24@
@H_403_24@
}else if (lua_type(m_state,-1) == LUA_TNUMBER) {
@H_403_24@
@H_403_24@
double value = lua_tonumber(m_state,-1);
@H_403_24@
pResultArray->addObject(CCDouble::create(value));
@H_403_24@
@H_403_24@
}else if (lua_type(m_state,-1) == LUA_TSTRING) {
@H_403_24@
@H_403_24@
const char* value = lua_tostring(m_state,-1);
@H_403_24@
pResultArray->addObject(CCString::create(value));
@H_403_24@
@H_403_24@
}else{
@H_403_24@
@H_403_24@
pResultArray->addObject(static_cast<ccobject*>(tolua_tousertype(m_state,NULL)));
@H_403_24@
}
@H_403_24@
// remove return value from stack
@H_403_24@
lua_pop(m_state,1); /* L: ... [G] ret1 ret2 ... ret*/
@H_403_24@
}
@H_403_24@
/* L: ... [G]*/
@H_403_24@
@H_403_24@
if (traceback)
@H_403_24@
{
@H_403_24@
lua_pop(m_state,1); // remove __G__TRACKBACK__ from stack /* L: ... */
@H_403_24@
}
@H_403_24@
}
@H_403_24@
}
@H_403_24@
@H_403_24@
lua_settop(m_state,0);
@H_403_24@
@H_403_24@
return 1;
@H_403_24@
}
@H_403_24@
</ccobject*>

其中,关于【 __G__TRACKBACK__】,可以查看一下HelloLua工程中的hello.lua文件,有部分内容如下:

@H_403_24@
-- for CCLuaEngine traceback
@H_403_24@
function __G__TRACKBACK__(msg)
@H_403_24@
cclog("----------------------------------------")
@H_403_24@
cclog("LUA ERROR: " .. tostring(msg) .. "\n")
@H_403_24@
cclog(debug.traceback())
@H_403_24@
cclog("----------------------------------------")
@H_403_24@
end

基本类型压栈的处理:

@H_403_24@
//清空栈
@H_403_24@
void CCLuaStack::clean(void)
@H_403_24@
{
@H_403_24@
lua_settop(m_state,0);
@H_403_24@
}
@H_403_24@
//以下为各种压栈
@H_403_24@
void CCLuaStack::pushInt(int intValue)
@H_403_24@
{
@H_403_24@
lua_pushinteger(m_state,intValue);
@H_403_24@
}
@H_403_24@
void CCLuaStack::pushFloat(float floatValue)
@H_403_24@
{
@H_403_24@
lua_pushnumber(m_state,floatValue);
@H_403_24@
}
@H_403_24@
void CCLuaStack::pushBoolean(bool boolValue)
@H_403_24@
{
@H_403_24@
lua_pushboolean(m_state,boolValue);
@H_403_24@
}
@H_403_24@
void CCLuaStack::pushString(const char* stringValue)
@H_403_24@
{
@H_403_24@
lua_pushstring(m_state,stringValue);
@H_403_24@
}
@H_403_24@
void CCLuaStack::pushString(const char* stringValue,int length)
@H_403_24@
{
@H_403_24@
lua_pushlstring(m_state,stringValue,length);
@H_403_24@
}
@H_403_24@
void CCLuaStack::pushNil(void)
@H_403_24@
{
@H_403_24@
lua_pushnil(m_state);
@H_403_24@
}

复杂类型压栈的处理:

@H_403_24@
//把ccobject压入堆栈
@H_403_24@
void CCLuaStack::pushCCObject(CCObject* objectValue,const char* typeName)
@H_403_24@
{
@H_403_24@
toluafix_pushusertype_ccobject(m_state,objectValue->m_uID,&objectValue->m_nLuaID,objectValue,typeName);
@H_403_24@
}
@H_403_24@
//吧CCLuaValue压入堆栈,这里根据value的类型进行不同的操作。
@H_403_24@
void CCLuaStack::pushCCLuaValue(const CCLuaValue& value)
@H_403_24@
{
@H_403_24@
const CCLuaValueType type = value.getType();
@H_403_24@
if (type == CCLuaValueTypeInt)
@H_403_24@
{
@H_403_24@
return pushInt(value.intValue());
@H_403_24@
}
@H_403_24@
else if (type == CCLuaValueTypeFloat)
@H_403_24@
{
@H_403_24@
return pushFloat(value.floatValue());
@H_403_24@
}
@H_403_24@
else if (type == CCLuaValueTypeBoolean)
@H_403_24@
{
@H_403_24@
return pushBoolean(value.booleanValue());
@H_403_24@
}
@H_403_24@
else if (type == CCLuaValueTypeString)
@H_403_24@
{
@H_403_24@
return pushString(value.stringValue().c_str());
@H_403_24@
}
@H_403_24@
else if (type == CCLuaValueTypeDict)
@H_403_24@
{
@H_403_24@
pushCCLuaValueDict(value.dictValue());
@H_403_24@
}
@H_403_24@
else if (type == CCLuaValueTypeArray)
@H_403_24@
{
@H_403_24@
pushCCLuaValueArray(value.arrayValue());
@H_403_24@
}
@H_403_24@
else if (type == CCLuaValueTypeCCObject)
@H_403_24@
{
@H_403_24@
pushCCObject(value.ccobjectValue(),value.getCCObjectTypename().c_str());
@H_403_24@
}
@H_403_24@
}
@H_403_24@
//把一个字典压入堆栈。
@H_403_24@
void CCLuaStack::pushCCLuaValueDict(const CCLuaValueDict& dict)
@H_403_24@
{
@H_403_24@
lua_newtable(m_state); /* L: table */
@H_403_24@
for (CCLuaValueDictIterator it = dict.begin(); it != dict.end(); ++it)
@H_403_24@
{
@H_403_24@
lua_pushstring(m_state,it->first.c_str()); /* L: table key */
@H_403_24@
pushCCLuaValue(it->second); /* L: table key value */
@H_403_24@
lua_rawset(m_state,-3); /* table.key = value,L: table */
@H_403_24@
}
@H_403_24@
}
@H_403_24@
//把一个数组压入堆栈
@H_403_24@
void CCLuaStack::pushCCLuaValueArray(const CCLuaValueArray& array)
@H_403_24@
{
@H_403_24@
lua_newtable(m_state); /* L: table */
@H_403_24@
int index = 1;
@H_403_24@
for (CCLuaValueArrayIterator it = array.begin(); it != array.end(); ++it)
@H_403_24@
{
@H_403_24@
pushCCLuaValue(*it); /* L: table value */
@H_403_24@
lua_rawseti(m_state,index); /* table[index] = value,L: table */
@H_403_24@
++index;
@H_403_24@
}
@H_403_24@
}
@H_403_24@
@H_403_24@
//把一个函数压入堆栈,这里由于函数已经注册到了Lua环境中,这里只要把它放到栈顶即可
@H_403_24@
bool CCLuaStack::pushFunctionByHandler(int nHandler)
@H_403_24@
{
@H_403_24@
toluafix_get_function_by_refid(m_state,nHandler); /* L: ... func */
@H_403_24@
if (!lua_isfunction(m_state,-1))
@H_403_24@
{
@H_403_24@
CCLOG("[LUA ERROR] function refid '%d' does not reference a Lua function",nHandler);
@H_403_24@
lua_pop(m_state,1);
@H_403_24@
return false;
@H_403_24@
}
@H_403_24@
return true;
@H_403_24@
}

猜你在找的Cocos2d-x相关文章