关于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. C++11无限制的unions

    [C++11无限制的unions] 在标准 C++ 中,并非任意的类型都能做为 union 的成员.比方说,带有 non-trivial 构造函数的类型就不能是 union 的成员.在新的标准里,移除 ...

  2. 在PhpStorm9中与Pi的xdebug进行调试

    PI的配置参考 http://www.cnblogs.com/yondy/archive/2013/05/01/3052687.html 在PhpStorm 9.0中参考下面的截图进行配置 配置完成以 ...

  3. Java反射机制(Class类的使用)

    1:通过无参构造实例化对象 package cn.itcast; /* * 通过无参构造实例化对象 * 通过Class类本身实例化对象,使用newInstance方法 * 需要注意的是:实例化类中存在 ...

  4. java反射工具类

    package com.yingchao.kgou.core; import java.lang.reflect.Field; import java.lang.reflect.InvocationT ...

  5. 用完成例程(Completion Routine)实现的重叠I/O模型

    /// 用完成例程(Completion Routine)实现的重叠I/O模型 /// 异步IO模型 /// 用完成例程来实现重叠I/O比用事件通知简单得多.在这个模型中,主线程只用不停的接受连接 / ...

  6. Python之函数进阶

    本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...

  7. spring AOP Bean添加新方法

    目的:为studentAdditionalDetails中添加Student的showDetails()和ExtraShowDetails()两个方法 spring  中AOP能够为现有的方法添加额外 ...

  8. mvc api odata 查询选项之 $inlinecount ,$format 选项

    网上百度“odata 语法”会出来很多结果,其中有一项是比较一致的,那就是odata支持一下几种语法: $filter  条件表达式 -- 对应sql语句的where条件查询,如:/Categorie ...

  9. Java程序打包成jar包

    方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法:jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] ...

  10. 关于 TIdHttp

    经验总结: 1.IdHttp 不支持多线程,只支持异步.所有网上的多线程写法下,如果同时并发多个长 GET 或 POST 请求时,会阻塞. 以下代码用于显示下载数据的进程. procedure TFo ...