关于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 ...
随机推荐
-
MyEclipse安装插件的几种方法
本文讲解MyEclipse(MyEclipse10)的三种方法,以SVN为例 Eclipse update site URL: http://subclipse.tigris.org/update_1 ...
-
bash的变量设置
1. myname=zhangsan //设置变量 2. echo $myname //显示变量 或者:echo ${myname} 3. myname="my name is $mynam ...
-
MapReduce、Hbase接口API实践
读取hdfs中文件并做处理,取出卡号,通过卡号连接hbase查询出对应客户号,写入redis,因为不用输出,所以不调用context.write方法,整个操作在一个map中便可完成 protected ...
-
Linux zabbix 配置注意事项
发现php-fpm启动之后,找不到 php-fpm.pid文件??? vi php-fpm.conf 去掉里面那个 pid = run/php-fpm.pid 前面的分号然后再启动php-fpm才能自 ...
-
总结的一些PHP开发中的tips
总结的一些PHP开发中的tips 发布时间:2013-05-28 12:47:44 来源: 评论:0 点击: 次 [字号:大 中 小] QQ空间新浪微博腾讯微博人人网豆瓣网百度空间百度搜藏开心 ...
-
IE样式兼容写法
1.第一种写法 利用<!--[if lt IE 6/7/8/9/10/11]><![endif]-->,给每个html写一个class <!DOCTYPE html> ...
-
CentOS安装Nexus(Maven私有库)详细配置及上传本地jar到私服
Nexus原理 Maven的原理就是将jar从远程*仓库下载到PC磁盘的本地仓库,当本地仓库没有发现需要的jar就会去Maven默认的远程*仓库Maven Central(由Apache维护)中寻 ...
-
Android(java)学习笔记64:线程的控制
1. 线程休眠: Java中线程休眠指让正在运行的线程暂停执行一段时间,进入阻塞状态,通过调用Thread类的静态方法sleep得以实现. 当线程调用sleep进入阻塞状态后,在其休眠的时间内,该线程 ...
-
AMQ学习笔记 - 05. 客户端模板化
概述 客户端编程模型中,大部分的步骤都是相同的.将相同的部分做成模板,将不同的部分预留接口,实现者就只需要针对不同的部分提供实现. 设计 类图 发送方客户端 说明: 基于模板的思想,SendTempl ...
-
xml解析之使用dom4j的api对xml文件进行CRUD(二)
在使用dom4j的api对xml文件进行CRUD(一)见博客http://blog.csdn.net/qq_32059827/article/details/51524330的基础上,再对做一次练习. ...