文档章节

cocos2d-lua绑定C++自定义类(自动+手动绑定回调函数)

Valiancer
 Valiancer
发布于 2017/08/24 18:31
字数 429
阅读 194
收藏 1

1.自定义C++类

将文件保存在frameworks/runtime-src/Classes/目录下,然后编写对应的.ini文件(在frameworks/cocos2d-x/tools/tolua/目录),然后修改genbindings.py(同目录)文件141行附近,将修改的ini文件加进去,可以把其他的注释掉。然后再cmd到当前文件夹,中执行genbindings.py脚本:python genbindings.py,会在cocos/scripting/lua-bindings/auto中生成文件,按照步骤2加入到工程对应的auto目录下,然后在AppDelegate.cpp文件中添加相关头文件和注册register_custom_function(stack->getLuaState())

2.添加到xcode

添加文件到对应的项目工程下,如图:

不要忘了勾选平台

添加搜索路径:

$(SRCROOT)/../../../../../runtime-src/Classes

3.添加到vs

$(EngineRoot)..\runtime-src\Classes

 

上边是自动绑定,lua调用c++

但是自动绑定不支持lambda,回调函数需要手动绑定

1.声明lua函数ID

​int _handlerID;


//注册lua回调函数,需lua主动调用
void XXX::registerScriptTouchHandler(int onTouchHandler)
{
	_handlerID = onTouchHandler;

	_handlerTouch = std::bind(&RichElementTextEx::handlerTouch, this, std::placeholders::_1);
}

​//C++回调函数,在其中调用lua回调函数并填入相应参数
void XXX::handlerTouch(const string& name)
{
	LuaStack* stack = LuaEngine::getInstance()->getLuaStack();

	stack->pushString(name.c_str());

	stack->executeFunctionByHandler(_handlerID, 1);
	stack->clean();
}

2.修改自动绑定生成的cpp文件

找到注册函数 lua_XXX_registerScriptTouchHandler(lua_State* tolua_S),将其中的

ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "RichElementTextEx:registerScriptTouchHandler");
if(!ok)
{
    ...
    return 0;
}

改为

arg0 = toluafix_ref_function(tolua_S, 2, 0);
//toluafix_get_function_by_refid(tolua_S, arg0);

3.lua调用

local val = xxx:create();
val:registerScriptTouchHandler(function(name)
                                   ...
                               end);

 

© 著作权归作者所有

共有 人打赏支持
Valiancer
粉丝 0
博文 18
码字总数 3937
作品 0
石景山
私信 提问
新里程碑:Cocos2d-x v3.0 正式版本发布!

历经半年多的精心打磨,Cocos2d-x v3.0正式版本最终发布!相比于去年9月份的Cocos2d-x v3.0-alpha版,正式版本在渲染器、性能、兼容性、稳定性等方面都得到了质的提升,并新增对WinPhone8的支...

oschina
2014/04/27
7.8K
11
CC3.2+Lua(8) ——Lua调用自定义C++类

【唠叨】 本节要讲的是如果将自己写的C++类注册进Lua环境,让Lua去调用自定义的C++类。 网上有很多都是用原始的tolua++工具来注册C++类的,我看了很多这样的教程,感觉操作起来十分麻烦,而且...

0-1
2014/10/29
0
0
C++ 跨平台多功能扩展库 - cpgf

cpgf 可为C++代码增加反射(元数据)、序列化、以及Luau和Python脚本绑定等功能,且不依赖任何外部工具。 cpgf 的目标是扩展C++语言,其中包含许多易于使用的功能,这些功能仅在其他更高级别...

wqking
09/17
0
0
CC_CALLBACK原理及应用

c++ 11 基础 : std::function 类模版 std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标进行存储、复制、和调用操作,这些目标包括函数、lambda表达式...

霄霄月月
2014/04/07
0
1
unreal4 引擎的 Lua 开发插件 - sluaunreal

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

匿名
08/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS官方钱包keosd

EOS官方钱包的名称是keosd,它负责管理你的私钥,并且帮你进行交易的签名。 不过不幸的是,keosd钱包对普通用户并不友好,它是一个命令行程序,目前还没有像以太坊的mist那样的图形化界面,而...

汇智网教程
38分钟前
1
0
ArrayList的实现原理以及实现线程安全

一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用Collections.syn...

一看就喷亏的小猿
54分钟前
2
0
Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
5
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
8
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部