c++回调lua函数,实现事件

基于上一篇文章

cocos2dx 导出c++类供lua使用

上一篇主要是因为不能调用lua函数 才那样解决,但是本篇能调用lua函数,那么目的实现也就简单多了

归其原因还是tolua 工具生成的hpp cpp文件的函数不对 虽然在c++中函数参数声明为LUA_FUNCTION 但是还是被当做了int处理

所以我们要手动处理函数的调用 也就是修改生成的 函数

...

生成的对应 代码 改为以下

	if (NULL == tolua_S)
		return 0;

	int argc = 0;
	NetMgr* self = nullptr;

#if COCOS2D_DEBUG >= 1
	tolua_Error tolua_err;
	if (!tolua_isusertype(tolua_S, 1, "cc.Http", 0, &tolua_err)) goto tolua_lerror;
#endif

	self = static_cast<NetMgr*>(tolua_tousertype(tolua_S, 1, 0));
#if COCOS2D_DEBUG >= 1
	if (nullptr == self) {
		tolua_error(tolua_S, "invalid ‘self‘ in function ‘tolua_cocos2d_Node_registerScriptHandler‘\n", NULL);
		return 0;
	}
#endif

	argc = lua_gettop(tolua_S) - 1;

	if (argc == 1)
	{
#if COCOS2D_DEBUG >= 1
		if (!toluafix_isfunction(tolua_S, 2, "LUA_FUNCTION", 0, &tolua_err))
			goto tolua_lerror;
#endif

		LUA_FUNCTION handler = toluafix_ref_function(tolua_S, 2, 0);
		self->setLuaFunc(handler);
		lua_settop(tolua_S, 1);
		return 0;
	}

	luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n", "cc.Node:registerScriptHandler", argc, 1);
	return 0;

#if COCOS2D_DEBUG >= 1
tolua_lerror:
	tolua_error(tolua_S, "#ferror in function ‘tolua_cocos2d_Node_registerScriptHandler‘.", &tolua_err);
	return 0;
#endif

头文件改为

class toLuaFunc/*base class for to call lun function*/
{
public:
	void setLuaFunc(LUA_FUNCTION handler);

protected:
	void callLuaFunc(const char*ARG);

	LUA_FUNCTION handler;

};

#define  URL_BASE "http://127.0.0.1:8080/cocos/"

#define DATA_MAX_LENGTH 100

class NetMgr :public toLuaFunc
{
public:
	static NetMgr*getInstance();

	/**
	 * @brief new a HttpRequest
	 * @param action  such as "login?name=1&&pass=1"
	 * @
	 */
	void getRequest(const char* action);

 

private:
	NetMgr(){}
	char _data[DATA_MAX_LENGTH];

};

cpp文件改为

#include "network_srv.h"
#include "CCLuaEngine.h"
#include "base/CCScriptSupport.h"

void toLuaFunc::setLuaFunc(LUA_FUNCTION handler)
{
	this->handler = handler;
}

void toLuaFunc::callLuaFunc(const char*ARG)
{
	CC_ASSERT(handler > 0, "call lua func ‘s handle must bigger than 0");

	cocos2d::CommonScriptData data(handler, ARG);
	cocos2d::ScriptEvent scriptEvent(cocos2d::kCommonEvent, &data);
	cocos2d::LuaEngine::getInstance()->sendEvent(&scriptEvent);
}

void NetMgr::getRequest(const char* action)
{
	log("c++ getRequest arg is  %s",action);

	string url = URL_BASE;
	url += action;

	HttpRequest*request = new HttpRequest;

	request->setUrl(url.c_str());
	request->setRequestType(HttpRequest::Type::GET);

	request->setResponseCallback([=](HttpClient*client, HttpResponse *respone)
	{
		if (respone->getResponseCode() != 200)return;

		vector<char>* buffer = respone->getResponseData();

		CC_ASSERT(DATA_MAX_LENGTH > buffer->size(), " NetMgr buffer size overfloaw");

		for (int i = 0; i < buffer->size(); i++)
		{
			_data[i] = (*buffer)[i];

		}
		_data[buffer->size()] = ‘\0‘;
		callLuaFunc(_data);

	});

	HttpClient::getInstance()->setTimeoutForConnect(10);
	HttpClient::getInstance()->send(request);
	request->release();

}

NetMgr*  NetMgr::getInstance()
{
	static NetMgr* _netmgr__ = 0;
	if (_netmgr__ == 0)
	{
		_netmgr__ = new NetMgr;
	}
	return _netmgr__;
}

lua文件

    local function menuCallbackClose()   
    
    
        http:getRequest("login?name=1&&pass=1")
        return 
        
    
    end

    label=cc.LabelTTF:create("login","",35)
    label:setPosition(self.size.width/2,self.size.height/2);
    rootNode:addChild(label)
  
  
    local menuToolsItem = rootNode:getChildByName("Button_1")
    menuToolsItem:addTouchEventListener(menuCallbackClose)
 
 local function callback(msg)
    label:setString(msg);
 end
 
    http=NetMgr:getInstance();
    http:setLuaFunc(callback);

其中cpp文件的还可以改为这样

void toLuaFunc::callLuaFunc(const char*ARG)
{
	CC_ASSERT(handler > 0, "call lua func ‘s handle must bigger than 0");
/*
	cocos2d::CommonScriptData data(handler, ARG);
	cocos2d::ScriptEvent scriptEvent(cocos2d::kCommonEvent, &data);
	cocos2d::LuaEngine::getInstance()->sendEvent(&scriptEvent);
*/

	cocos2d::LuaEngine::getInstance()->getLuaStack()->pushString(ARG);
	cocos2d::LuaEngine::getInstance()->getLuaStack()->executeFunctionByHandler(handler, 1);
	cocos2d::LuaEngine::getInstance()->getLuaStack()->clean();

}
时间: 2024-10-06 04:41:41

c++回调lua函数,实现事件的相关文章

Lua函数执行流程及函数延续点问题的研究

第一:Lua函数调用的总体流程 在保护性调用的情况下,lua中函数调用的流程如下,非保护性调用的流程更加简单,请追踪lua_call函数 int docall (lua_State *L, int narg, int nres) | —— int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc ...) | —— luaD_pcall (lua_State *L, Pfunc func, void *u,ptrdiff

c++回调lua的几种方式

第一种,通过函数名查找,每次都要查效率偏低 //全局表中找到函数luaL_getglobal(L, "OnTimer");//调用 lua_call(...); 第二种,c++提供接口由脚本注册回调函数,需要管理lua_ref的生命周期,管理不妥会有内存泄露 //c++提供lua接口,接受传递过来的lua函数int addTimer(lua_state* L) { int delay = lua_tonumer(L); int callback = luaL_ref(L, LUA_RE

Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二部分将第一部分的示例进行扩展,展示了如何在python中调用多线程的C模块:第三部分扩展了第二部分,增加了在C模块的线程中回调python的演示. 本文所用的环境为:64位Win7 + python 3.4 x86 + vs2010 一.windows下的C语言多线程程序 windows下多线程编程

C语言调用Lua函数

记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪.那个时期,人们经常称互联网为赛博空间.如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息.然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部<红楼梦>那么多的文字.只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识.在你的时间线上,两条相邻信息往往是八竿子也打不着的.而且你还时不时去

lua函数精讲(一)

函数的用途: 1.完成指定的任务,这种情况下作为调用语句使用. 2.计算并返回值,这种情况下,函数作为赋值语句的表达式使用. 函数的参数为空,必须使用()表示函数调用.例外:当函数只有一个参数,并且这个参数是字符串或表构造时,()是可选的. lua提供了面向对象调用函数的语法 o:foo(x)与o.f(o,x)是等价的. lua函数的实参与形参的匹配与赋值语句类似,多余部分被忽略,缺少部分nil补足. lua函数可以返回多个值,return后列出要返回值的列表即可返回多值 s, e = stri

C中调用Lua函数

我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglobal(L, "f"); // 获取lua函数f lua_pushnumber(L, x); // 压入参数x和y lua_pushnumber(L, y); if(lua_pcall(L, 2, 1, 0) != 0) error(L, "error running functi

JavaScript 频繁发射事件处理的优化 --- 函数节流/事件稀释

引子:昨天面试时面试官问了如何实现一个固定导航栏,在我答完后面试官问我可能存在哪些问题,如何优化? 这个问题我答得不太好,但现在回想起来应该有两个问题: 1. 把 fixbar元素 position:fixed 之后,它将脱离文档流,后面的元素将会跟上,这可能会形成一个闪烁,解决方法是跟随的元素设置 margin-top 为 fixbar 元素的高度,或者替换上一个等高的元素,这点面试时候没有描述出来. 2. 就是这篇博文主要内容 ”函数节流“,英文名 throttle 函数,在一些库,如und

JavaScript的函数和事件(转)

一.默认函数 JavaScript提供了一些默认的函数 编码函数escape():将非字母.数字字符转换成ASCII码 译码函数unescape():将ASCII码转换成字母.数字字符 求值函数eval() 数值判断函数isNaN():判断一个值是否为非数值类型 整数转换函数parseInt():将不同进制(二.八.十六进制)的数值转换成十进制整数 浮点数转换函数parseFloat():将数值字串转换成浮点数 1.eval()函数 求值函数eval()的格式为:eval(<表达式>) 下面的

lua 函数练习

1 --逻辑表达式 2 3 --1+2+3+...+n 4 function fun1(n) 5 local sum = 0 6 for i=1,n do 7 sum = sum + i 8 end 9 return sum 10 end 11 12 -- 计算奇数和 13 function fun2(n) 14 local sum = 0 15 for i=1,n,2 do 16 sum = sum + i 17 end 18 return sum 19 end 20 21 -- 计算偶数和