文档章节

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

梦想游戏人
 梦想游戏人
发布于 2015/10/24 11:31
字数 601
阅读 1433
收藏 0

基于上一篇文章 

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



}


© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 35
博文 435
码字总数 123998
作品 0
成都
私信 提问
unreal4 引擎的 Lua 开发插件 - sluaunreal

sluaunreal 是腾讯开源的适用于 unreal4 引擎的 Lua 开发插件,可让开发者高效地使用 Lua 进行业务开发。sluaunreal 作为 unreal 引擎的插件,通过 unreal 自带蓝图接口的反射能力,结合 li...

匿名
08/04
0
0
腾讯开源 Lua 开发插件 sluaunreal,加速游戏业务开发

近日,腾讯开源了其用于游戏业务的 sluaunreal,该项目是适用于 unreal4 引擎的 Lua 开发插件,可让开发者高效地使用 Lua 进行业务开发。 项目地址:https://github.com/Tencent/sluaunreal...

h4cd
08/04
2.7K
1
FFLIB之FFLUA——C++嵌入Lua&扩展Lua利器

摘要: 在使用C++做服务器开发中,经常会使用到脚本技术,Lua是最优秀的嵌入式脚本之一。Lua的轻量、小巧、概念之简单,都使他变得越来越受欢迎。本人也使用过python做嵌入式脚本,二者各有特...

知然
2013/01/27
0
0
cocos2d-lua绑定C++自定义类(自动+手动绑定回调函数)

1.自定义C++类 将文件保存在frameworks/runtime-src/Classes/目录下,然后编写对应的.ini文件(在frameworks/cocos2d-x/tools/tolua/目录),然后修改genbindings.py(同目录)文件141行附近,将...

Valiancer
2017/08/24
0
0
libuv的典型应用——CTP的Node.js封装

写过CTP的同学可能不多,这是一个期货接口。没听说过的也无妨。 C++多线程回调 CTP 提供了若干个父类供开发者继承,里面的回调都是通过覆盖父类的纯虚函数实现。当SDK有事件发生的时候,就会...

一个灰
10/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

easyui tree

<tr> <th><spring:message code="wf.borrow.examiner"/></th> <td> <input id="inp-examiner1" type="text" name="examiner1" style="width:197px;height:20px;" data-options="required:tru......

小兵胖胖
6分钟前
0
0
内存性能的正确解读

一台服务器,不管是物理机还是虚拟机,必不可少的就是内存,内存的性能又是如何来衡量呢。 1. 内存与缓存 现在比较新的CPU一般都有三级缓存,L1 Cache(32KB-256KB),L2 Cache(128KB-2MB)...

阿里云云栖社区
9分钟前
0
0
微服务架构:Zuul 1.0 和 2.0 我们该如何选择?

在今年5月中,Netflix终于开源了它的支持异步调用模式的Zuul网关2.0版本,真可谓千呼万唤始出来。从Netflix的官方博文[附录1]中,我们获得的信息也比较令人振奋: The Cloud Gateway team a...

大木老师故事的小黄花
9分钟前
0
0
基础掌握

哪些是基础功呢?我觉得包括: 数据结构和算法:链表、队列、栈、堆、树(RBT, B/B+)、跳表、哈希、图;查找(二分、bst)、排序(冒泡、插入、快排、归并、堆排、希尔)、递归、归并、回溯、...

边鹏_尛爺鑫
11分钟前
0
0
Android APP的安装路径

一. Android应用安装路径有两种情况: system/app 系统自带的应用程序,无法删除。root后可以删除,注意可能造成系统崩溃,不过有的垃圾捆绑软件只能这么删除了 data/app 用户程序安装的目录,...

天王盖地虎626
14分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部