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);
如果有什么更好的方法,请大牛指出