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

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);


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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值