关于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;
}

带来的不便:

  1. js中每个需要响应触摸的地方,都要监听消息,移除消息,很麻烦
  2. 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触摸事件的优化的更多相关文章

  1. 【转载】Quick 中的触摸事件

    原文地址 http://cn.cocos2d-x.org/article/index?type=quick_doc&url=/doc/cocos-docs-master/manual/fram ...

  2. js 处理移动端触摸事件

    在处理移动端的touch事件时,我们可以选择一些插件来处理,比如jquery ui touch punch.js 提供丰富的触摸效果,可以满足移动端的开发, 但是,有些移动端开发中,并不需要如此复杂的 ...

  3. iOS中的触摸事件和手势处理

    iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并 ...

  4. cocos2dx中的触摸事件及触摸优先级

    1.只有CCLayer及其派生类才有触摸功能. 2.开启触摸 setTouchEnable(true); 3.设置触摸模式,单点,多点(仅IOS支持) setTouchMode(kCCTouchesO ...

  5. iOS中的触摸事件,手势识别,摇晃事件等

    在iOS中,事件可以划分为以下几类: 1.触摸事件:通过触摸,手势进行触发(手指点击.缩放等) 2.运动事件:通过加速器触发(例如手机晃动) 3.远程控制事件:通过其他远程设备触发(例如耳机控制按钮) ...

  6. 浅析iOS中的触摸事件

    一.什么是响应者对象? 在 iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象”.UIApplication.UIViewControl ...

  7. VIew中的触摸事件 touchBegin 等一系列方法

    5.触摸事件  touchBegin 等一系列方法 1)手指按下 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 2 ...

  8. react-native中的触摸事件

    移动应用上的用户交互基本靠"摸".当然,"摸"也是有各种姿势的:在一个按钮上点击,在一个列表上滑动, 或是在一个地图上缩放.React Native 提供了可以 ...

  9. vue中使用触摸事件,上滑,下滑,等

    第一步,下载一个包 npm install kim-vue-touch -s 在当前项目中下载包 第二部 import vueTouch from 'kim-vue-touch' Vue.use(vu ...

随机推荐

  1. B - Kefa and Company

    B - Kefa and Company Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I6 ...

  2. php连接mysql配置

    php连接mysql测试代码: <?php $link=mysql_connect('localhost','root','123456'); if(!$link) echo "失败! ...

  3. getName()、getCanonicalName()、getSimpleName()异同

    package classes; class Box { class Inner { } } public class TestGetName { public static void main(St ...

  4. Eclipse报错 Unable to execute dex: Multiple dex files define Lcom/kenai/jbosh/AbstractAttr

    这个错误时jar包重复造成的!! 看看有没有多的private Libary  删除即可!!!

  5. OpenStack Hacker养成指南

    0 阅读指南 希望本文能够解开你心中萦绕已久的心结,假如是死结,请移步到 https://wiki.openstack.org/wiki/Main_Page 学习OpenStack其实就是学习各种Py ...

  6. Sending messages to non-windowed applications -- AllocateHWnd, DeallocateHWnd

    http://delphi.about.com/od/windowsshellapi/l/aa093003a.htm Page 1: How Delphi dispatches messages in ...

  7. 编写一个JavaScript函数 parseQueryString,把URL参数解析为一个对象

    var url="http://www.taobao.com/index.php?key0=0&key1=1&key2=2"; function parseQuer ...

  8. 【转】selenium及webdriver的原理

    主要内容转自:http://blog.csdn.net/ant_ren/article/details/7968582和http://blog.csdn.net/ant_ren/article/det ...

  9. 基于私钥加密公钥解密的RSA算法C#实现

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  10. 关于android 图像格式问题

    这算是篇总结吧.6月份开始做的一个android上的ar项目结束了.我做的部分是二维码识别和图像识别的预处理.这个项目虽然很累,但是让我学到了很多东西,特别是严格的编码规则,和java代码的效率优化, ...