您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x-2.1beta3-x-2.1.1调用lua带参数全局函数

2013-04-27 14:55 555 查看
CCLuaEngine.h

行212-221

int pushInt(int data);
int pushFloat(float data);
int pushBoolean(bool data);
int pushString(const char* data);
int pushString(const char* data, int length);
int pushNil(void);
int pushCCObject(CCObject* pObject, const char* typeName);
int pushCCLuaValue(const CCLuaValue& value);
int pushCCLuaValueDict(const CCLuaValueDict& dict);
int pushCCLuaValueArray(const CCLuaValueArray& array);

已经有这些把各种参数压栈的接口

 

行191

virtual int executeGlobalFunction(const char* functionName);

也有这种不带参数调用lua全局函数的接口

 

行222

int executeFunctionByHandler(int nHandler, int numArgs);

也有这用通过hander带参数调用lua函数的接口

 

就是没有通过functionName带参数调用lua函数的接口,所以需要自己实现一个,下面是实现代码

int executeGlobalFunction( const char* functionName, int numArgs )
{
lua_State *luaState = CCLuaEngine::defaultEngine()->getLuaState();

lua_getglobal(luaState, functionName);       /* query function by name, stack: function */
if (lua_isfunction(luaState, -1))
{
if (numArgs > 0)
{
lua_insert(luaState, -(numArgs + 1));                        /* stack: ... func arg1 arg2 ... */
}

int traceback = 0;
lua_getglobal(luaState, "__G__TRACKBACK__");                     /* stack: ... func arg1 arg2 ... G */
if (!lua_isfunction(luaState, -1))
{
lua_pop(luaState, 1);                                        /* stack: ... func arg1 arg2 ... */
}
else
{
traceback = -(numArgs + 2);
lua_insert(luaState, traceback);                             /* stack: ... G func arg1 arg2 ... */
}

int error = 0;
error = lua_pcall(luaState, numArgs, 1, traceback);              /* stack: ... ret */
if (error)
{
if (traceback == 0)
{
CCLOG("[LUA ERROR] %s", lua_tostring(luaState, - 1));    /* stack: ... error */
lua_pop(luaState, 1); // remove error message from stack
}
return 0;
}

// get return value
int ret = 0;
if (lua_isnumber(luaState, -1))
{
ret = lua_tointeger(luaState, -1);
}
else if (lua_isboolean(luaState, -1))
{
ret = lua_toboolean(luaState, -1);
}

lua_pop(luaState, 1); // remove return value from stack
return ret;
}
else
{
CCLOG("[LUA ERROR] name '%s' does not represent a Lua function", functionName);
lua_pop(luaState, 1);
lua_pop(luaState, numArgs); // remove args from stack
return 0;
}
}


通过这个接口可以方便的带参数调用lua全局函数

CCLuaEngine::defaultEngine()->pushInt(intData);
CCLuaEngine::defaultEngine()->pushString(data, dataSize);
executeGlobalFunction("myFun", 2);


如果有什么更好的方法,请大牛指出

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x lua