关于js-binding中Layer触摸事件的优化
关于js-binding中Layer触摸事件的优化
cocos2d-x 3.7
1. 目前js中监听触摸事件带来的不便(特别是cocosbuilder)
在目前的js-binding中,如果要监听layer的触摸事件,需要自己监听touch事件,如:
var touchLayer = cc.Layer.creat();
cc.eventManager.addListener({
event: cc.EventListener.TOUCH_ONE_BY_ONE,
onTouchBegan: function(event){
cc.log("touch begin");
return true;
},
onTouchMoved: function(event){
cc.log("touch move");
}
}, touchLayer);
而不是像lua-binding一样,在c++层收到触摸消息(touchbegan/touchmove...)后,调用lua事先注册的触摸相应接口:
bool Layer::onTouchBegan(Touch *touch, Event *event)
{
#if CC_ENABLE_SCRIPT_BINDING
if (kScriptTypeLua == _scriptType) //只有lua-binding
{
return executeScriptTouchHandler(EventTouch::EventCode::BEGAN, touch, event) == 0 ? false : true;
}
#endif
CC_UNUSED_PARAM(event);
CCASSERT(false, "Layer#ccTouchBegan override me");
return true;
}
带来的不便:
- js中每个需要响应触摸的地方,都要监听消息,移除消息,很麻烦
- cocosbuilder编辑的layer就算开启了touch enable也无效(还是需要添加监听代码)
为什么不和lua-binding风格一样呢,那么cocosbuilder编辑的touchlayer就可以这么响应触摸了:
touchLayer.onTouchBegan = function(touch) { return true; };
touchLayer.onTouchMoved = function(touch) {};
So simple
手动创建的layer就可以这么写了
var touchLayer = cc.Layer.create();
//目前以下3个接口,均未绑定在js中
touchLayer.setsetTouchMode(1);
touchLayer.setSwallowsTouches(true);
touchLayer.setTouchEnabled(true);
touchLayer.onTouchBegan = function(touch) { return true; };
touchLayer.onTouchMoved = function(touch) {};
如此一来就不用每次再去添加事件,移除事件了。
2. 实现方法
1.允许layer的触摸事件发生时,c++回调js注册的触摸响应接口:
把layer中,所有if (kScriptTypeLua == _scriptType)
的地方改为if (kScriptTypeNone != _scriptType)
,这样c++层在收到触摸消息后,就会回调js注册的接口了。(更改这一步,对于cocosbuilder编辑的layer足够了,那么用代码创建的layer需要做第二步)
2.将setsetTouchMode/setSwallowsTouches/setTouchEnabled
三个接口绑定到js中(去掉它们的CC_DEPRECATED_ATTRIBUTE,然后重新运行一下自动绑定脚本即可)。
3.ScriptingCore中有一个触摸响应判断的bug,将在下一篇文章中指出。
关于js-binding中Layer触摸事件的优化的更多相关文章
- 【转载】Quick 中的触摸事件
原文地址 http://cn.cocos2d-x.org/article/index?type=quick_doc&url=/doc/cocos-docs-master/manual/fram ...
- js 处理移动端触摸事件
在处理移动端的touch事件时,我们可以选择一些插件来处理,比如jquery ui touch punch.js 提供丰富的触摸效果,可以满足移动端的开发, 但是,有些移动端开发中,并不需要如此复杂的 ...
- iOS中的触摸事件和手势处理
iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并 ...
- cocos2dx中的触摸事件及触摸优先级
1.只有CCLayer及其派生类才有触摸功能. 2.开启触摸 setTouchEnable(true); 3.设置触摸模式,单点,多点(仅IOS支持) setTouchMode(kCCTouchesO ...
- iOS中的触摸事件,手势识别,摇晃事件等
在iOS中,事件可以划分为以下几类: 1.触摸事件:通过触摸,手势进行触发(手指点击.缩放等) 2.运动事件:通过加速器触发(例如手机晃动) 3.远程控制事件:通过其他远程设备触发(例如耳机控制按钮) ...
- 浅析iOS中的触摸事件
一.什么是响应者对象? 在 iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象”.UIApplication.UIViewControl ...
- VIew中的触摸事件 touchBegin 等一系列方法
5.触摸事件 touchBegin 等一系列方法 1)手指按下 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 2 ...
- react-native中的触摸事件
移动应用上的用户交互基本靠"摸".当然,"摸"也是有各种姿势的:在一个按钮上点击,在一个列表上滑动, 或是在一个地图上缩放.React Native 提供了可以 ...
- vue中使用触摸事件,上滑,下滑,等
第一步,下载一个包 npm install kim-vue-touch -s 在当前项目中下载包 第二部 import vueTouch from 'kim-vue-touch' Vue.use(vu ...
随机推荐
- c#通过操作mongodb gridfs实现文件的数据库存储
@(编程) 源码 using MongoDB.Driver; using MongoDB.Driver.GridFS; using System.IO; namespace Wisdombud.Mon ...
- codeforces 644A Parliament of Berland
A. Parliament of Berland time limit per test 1 second memory limit per test 256 megabytes input stan ...
- linux 5 配置xmanager
0 关闭防火墙或者打开177端口 iptables -A INPUT -p udp --dport 177 -j ACCEPT 1.vi /etc/inittab id:5:initdefault: ...
- LA4329 Ping pong(树状数组与组合原理)
N (3N20000)ping pong players live along a west-east street(consider the street as a line segment). E ...
- canvas加载gif
http://ernestdelgado.com/public-tests/gifoncanvas/ <!DOCTYPE html><html><head> < ...
- 扩展User增加部门字段
通过继承User<TEntity>类增加一个字段 /// <summary>用户信息</summary> [Serializable] [ModelCheckMod ...
- IL学习资料
读懂IL代码就这么简单 由浅入深CIL系列 .net IL 指令速查
- swift 与 指针初级使用
swift 里面对应C 的基础类型前面加C,CInt.CBool和CChar UnsafePointer<CChar> 对应C的 const char *;常量指针不可变 UnsafeMu ...
- 开发extjs常用的插件
Spket是目前支持Ext 2.0最为出色的IDE. 它采用.jsb project file 文件并将继承于基类和所有文档的内容嵌入到生成代码提示的Script doc中.注:不支持配置项的代码提示 ...
- 内存不足(OutOfMemory)的调试分析
32位操作系统的寻址空间是4G,其中有2G被操作系统占用,也就是说留给用户进程的内存只有2G(其中还要扣除程序加载时映像占用的部分空间,一般只有1.6G~1.8G左右可以使用). 如果进程运行中需要申 ...