文档章节

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

Valiancer
 Valiancer
发布于 2017/08/24 18:31
字数 370
阅读 159
收藏 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
博文 20
码字总数 4317
作品 0
石景山
CC3.2+Lua(8) ——Lua调用自定义C++类

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

0-1
2014/10/29
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
腾讯开源 Lua 开发插件 sluaunreal,加速游戏业务开发

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

h4cd
08/04
0
1
用LuaBridge为Lua绑定C/C++对象

最近为了总结Lua绑定C/C++对象的各种方法、第三方库和原理,学习了LuaBridge库为Lua绑定C/C++对象,下面是学习笔记,实质是对该库的Reference Manual基本上翻译了一遍,学习过程中测试代码,...

shezjl
2015/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

又一个centos文件顺序导致的问题

背景 新的centos似乎对于文件顺序做了特别的优化 和文件顺序出现的问题确实多了不少 centos7导致的spring循环依赖【实际上和这个问题不一样 不过由此衍生出的问题】 某应用放在新的系统开始报...

Mr_Qi
14分钟前
0
0
阿里云国际版香港CN2测评 月付9美元/30M带宽/1T流量

市面上很多家香港VPS服务商,一直都说阿里云国际版香港CN2线路好,延迟低,速度快,价格便宜流量还多,那么这个香港线路到底怎么样呢?本文从性能、延时、路由、速度方面来全方面测评一下阿里...

flyzy2005
56分钟前
0
0
撤销git commit --amend

it commit -amend之后想撤销 git reset HEAD@{1}

xiaomge
今天
0
0
有意思的TimeUnit

java.util.concurrent.TimeUnit 这个类,相信童鞋们都不陌生。它是一个enum: public enum TimeUnit 好吧,我一直把它当做一个枚举类来用。偶然看到还有别的用法,大吃一斤,原来 TimeUnit 并...

polly
今天
10
0
生成pyc

Python生成pyc文件 pyc文件是py文件编译后生成的字节码文件(byte code)。pyc文件经过python解释器最终会生成机器码运行。所以pyc文件是可以跨平台部署的,类似Java的.class文件。一般py文件改...

Mr_Tea伯奕
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部