cocos2d-js v3.0 新功能-----事件分发机制

事件分发机制

简介
在使用时,首先创建一个事件监听器,事件监听器包含以下几种:

  • 触摸事件 (cc.EventListenerTouch)
  • 键盘响应事件 (cc.EventListenerKeyboard)
  • 加速记录事件 (cc.EventListenerAcceleration)
  • 鼠标响应事件 (cc.EventListenerMouse)
  • 自定义事件 (cc.EventListenerCustom)
以上事件监听器统一由 cc.eventManager 来进行管理,它是一个单例对象。它的工作需要三部分组成:
  • 事件管理器 cc.eventManager
  • 事件类型 cc.EventTouch,cc.EventKeyboard 等
  • 事件监听器 cc.EventListenerTouch,cc.EventListenerKeyboard 等
  • 监听器实现了各种触发后的逻辑,在适当时候由 事件管理器分发事件类型,然后调用相应类型的监听器。
    使用方法
    现在将要实现在一个界面中添加三个按钮,三个按钮将会互相遮挡,并且能够触发触摸事件,以下是具体实现
    首先创建三个精灵,作为三个按钮的显示图片
    复制代码
    1. var sprite1 = cc.Sprite.create("Images/CyanSquare.png");
    2. sprite1.x = size.width/2 - 80;
    3. sprite1.y = size.height/2 + 80;
    4. this.addChild(sprite1,10);
    5. var sprite2 = cc.Sprite.create("Images/MagentaSquare.png");
    6. sprite2.x = size.width/2;
    7. sprite2.y = size.height/2;
    8. this.addChild(sprite2,20);
    9. var sprite3 = cc.Sprite.create("Images/YellowSquare.png");
    10. sprite3.x = 0;
    11. sprite3.y = 0;
    12. sprite2.addChild(sprite3,1);


    创建一个单点触摸事件监听器,并完成逻辑处理内容
    复制代码
    // 创建一个事件监听器 OneByOne 为单点触摸
  • var listener1 = cc.EventListener.create({
  • event: cc.EventListener.TOUCH_ONE_BY_ONE,
  • swallowTouches: true,// 设置是否吞没事件,在 onTouchBegan 方法返回 true 时吞没
  • onTouchBegan: function (touch,event) { //实现 onTouchBegan 事件回调函数
  • var target = event.getCurrentTarget();// 获取事件所绑定的 target
  • // 获取当前点击点所在相对按钮的位置坐标
  • var locationInNode = target.convertToNodeSpace(touch.getLocation());
  • var s = target.getContentSize();
  • var rect = cc.rect(0,s.width,s.height);
  • if (cc.rectContainsPoint(rect,locationInNode)) { // 点击范围判断检测
  • cc.log("sprite began... x = " + locationInNode.x + ",y = " + locationInNode.y);
  • target.opacity = 180;
  • return true;
  • }
  • return false;
  • },247)"> onTouchMoved: function (touch,event) { // 触摸移动时触发
  • // 移动当前按钮精灵的坐标位置
  • var target = event.getCurrentTarget();
  • var delta = touch.getDelta();
  • target.x += delta.x;
  • target.y += delta.y;
  • onTouchEnded: function (touch,event) { // 点击事件结束处理
  • cc.log("sprite onTouchesEnded.. ");
  • target.setOpacity(255);
  • if (target == sprite2) {// 重新设置 ZOrder,显示的前后顺序将会改变
  • sprite1.setLocalZOrder(100);
  • } else if (target == sprite1) {
  • sprite1.setLocalZOrder(0);
  • });

  • cc.EventListener.create 是一个创建事件监听器的总接口,你可以使用 event 来设置创建的监听器类型,
    如上例中的cc.EventListener.TOUCH_ONE_BY_ONE 为单次触摸事件监听器。
    Event类型列表:
    1. cc.EventListener.TOUCH_ONE_BY_ONE
    2. cc.EventListener.TOUCH_ALL_AT_ONCE
    3. cc.EventListener.KEYBOARD
    4. cc.EventListener.MOUSE
    5. cc.EventListener.ACCELERATION
    6. cc.EventListener.CUSTOM
    添加事件监听器到事件管理器
    复制代码
    // 添加监听器到管理器
  • cc.eventManager.addListener(listener1,sprite1);
  • cc.eventManager.addListener(listener1.clone(),sprite2);
  • cc.eventManager 是单例对象,可直接拿来使用,通过它管理所有事件分发情况。通过 addListener 函数可以将listener加入到管理器中,需要注意的是第二个参数,如果传入的是一个Node对象,则加入的是SceneGraphPriority(精灵以显示优先级) 类型的listener,如果是一个数值类型的参数,则入到的是FixedPriority 类型的listener。
    注意: 这里当我们再次使用 listener1 的时候,需要使用 clone() 方法创建一个新的克隆,因为在使用 addListener 方法时,会对当前使用的事件监听器添加一个已注册的标记,这使得它不能够被添加多次。另外,有一点非常重要,FixedPriority 类型的 listener添加完之后需要手动remove,而SceneGraphPriority 类型的 listener是跟node绑定的,在node调用cleanup时会被移除。具体的示例用法可以参考引擎自带的tests。
    更快速的添加事件监听器到管理器的方式
    复制代码
    cc.eventManager.addListener({
  • event: cc.EventListener.TOUCH_ALL_AT_ONCE,247)"> onTouchesMoved: function (touches,event) {
  • var touch = touches[0];
  • var node = event.getCurrentTarget().getChildByTag(TAG_TILE_MAP);
  • var diff = cc.pAdd(delta,node.getPosition());
  • node.setPosition(diff);
  • cc.eventManager的 addListener 的第一个参数也支持两种参数, cc.EventListener 类型和json格式的对象,如果是json格式对象,方法会根据event来创建相关的监听器。
    新的触摸机制
    以上的步骤看似相对 2.x 版本触摸机制实现时,复杂了点,在老的版本中继承一个 delegate ,里面定义了 onTouchBegan 等方法,然后在里面判断点击的元素,进行逻辑处理。而这里将事件处理逻辑独立出来,封装到一个 Listener 中,而以上的逻辑实现了以下功能:
    通过添加事件监听器,将精灵以显示优先级 (SceneGraphPriority) 添加到事件分发器。这就是说,当我们点击精灵按钮时,根据屏幕显示的“遮盖”实际情况,进行有序的函数回调(即:如图中黄色按钮首先进入 onTouchBegan 逻辑处理)。
    在事件逻辑处理时,根据各种条件处理触摸后的逻辑,如点击范围判断,设置被点击元素为不同的透明度,达到点击效果。
    因为设置了 swallowTouches: true 并且在 onTouchBegan 中做相应的判断,以决定其返回值是 false 还是 true,用来处理触摸事件是否依据显示的顺序关系向后传递。
    注意:与 SceneGraphPriority 所不同的是 FixedPriority 将会依据手动设定的 Priority 值来决定事件相应的优先级,值越小优先级越高。
    其它事件派发处理模块
    除了触摸事件响应之外,还有以下模块使用了相同的处理方式。
    键盘响应事件
    除了键盘,还可以是终端设备的各个菜单,他们使用同一个监听器来进行处理。
    //给statusLabel绑定键盘事件
    cc.eventManager.addListener({
    event: cc.EventListener.KEYBOARD,
    onKeyPressed:function(keyCode,event){
    var label = event.getCurrentTarget();
    label.setString("Key " + keyCode.toString() + " was pressed!");
    },serif; font-size:14px; line-height:24px">onKeyReleased: function(keyCode,serif; font-size:14px; line-height:24px">label.setString("Key " + keyCode.toString() + " was released!");
    }

    加速计事件
    在使用加速计事件监听器之前,需要先启用此硬件设备:
    cc.inputManager.setAccelerometerEnabled(true);
    然后将相应的事件处理监听器与sprite进行绑定就可以了,如下:
    复制代码
    event: cc.EventListener.ACCELERATION,247)"> callback: function(acc,event){
  • //这里处理逻辑
  • 鼠标响应事件
    在 3.0 中多了鼠标捕获事件派发,这可以在不同的平台上,丰富我们游戏的用户体验。
    复制代码
    event: cc.EventListener.MOUSE,247)"> onMouseMove: function(event){
  • var str = "MousePosition X: " + event.getLocationX() + "Y:" + event.getLocationY();
  • // do something...
  • onMouseUp: function(event){
  • var str = "Mouse Up detected,Key: " + event.getButton();
  • onMouseDown: function(event){
  • var str = "Mouse Down detected,247)"> onMouseScroll: function(event){
  • var str = "Mouse Scroll detected,X: " + event.getLocationX() + "Y:" + event.getLocationY();
  • 自定义事件
    以上是系统自带的事件类型,这些事件由系统内部自动触发,如 触摸屏幕,键盘响应等,除此之外,还提供了一种 自定义事件,简而言之,它不是由系统自动触发,而是人为的干涉,如下:
    复制代码
    var _listener1 = cc.EventListener.create({
  • event: cc.EventListener.CUSTOM,247)"> eventName: "game_custom_event1",247)"> callback: function(event){
  • statusLabel.setString("Custom event 1 received," + event.getUserData() + " times");
  • });
  • cc.eventManager.addListener(this._listener1,serif; font-size:14px; line-height:24px">以上定义了一个 “自定义事件监听器”,实现了一些逻辑,并且添加到事件分发器。那么以上逻辑是在什么情况下响应呢?请看如下:
    复制代码
    ++selfPointer._item1Count;
  • var event = new cc.EventCustom("game_custom_event1");
  • event.setUserData(selfPointer._item1Count.toString());
  • cc.eventManager.dispatchEvent(event);
  • 定义了一个 EventCustom ,并且设置了其 UserData 数据,手动的通过 cc.eventManager.dispatchEvent(event); 将此事件分发出去,从而触发之前所实现的逻辑。
    移除事件监听器
    我们可以通过以下方法移除一个已经被添加了的监听器。
    复制代码
    cc.eventManager.removeListener(listener); //移除一个已添加的监听器

    也可以使用如下方法,移除注册到cc.eventManager中以一种类型注册的所有监听器,也可以用这个方法移除注册到cc.eventManager以同一node对象注册的所有监听器。
    复制代码
    cc.eventManager.removeListeners(cc.EventListener.TOUCH_ONE_BY_ONE); //移除所有TOUCH_ONE_BY_ONE类型的监听器
  • cc.eventManager.removeListeners(aSprite); //移除所有与aSprite相关的监听器

  • 还可以使用如下方法,移除cc.eventManager中所有监听器。
    复制代码
    cc.eventManager.removeAllListeners();

    当使用 removeAll 的时候,此节点的所有的监听将被移除,推荐使用 指定删除的方式。
    _注意:_removeAll 之后 菜单 也不能响应。因为它也需要接受触摸事件。
    暂停/恢复 cc.Node(SceneGraph类型)的监听器
    开发过程中,我们经常会遇到这样的情况:想要让一个Layer中所有的Node对象的事件都停止响应。 在响应用户事件后,又要恢复该Layer的所有事件响应。如: 用户想要显示一个模式对话框,显示对话框后,禁止对话框后所有对象的事件响应。 在用户关闭对话框后,又恢复这些对象的事件响应。
    我们只需要暂停根node的事件,就可以让根节点以及其子节点暂停事件响应。 代码如下:
    复制代码
    cc.eventManager.pauseTarget(aLayer,true);//让aLayer对象暂停响应事件

    而恢复对象的事件响应也非常简单:
    复制代码
    cc.eventManager.resumeTarget(aLayer,true); //让aLayer对象恢复响应事件

    注意: 第二个参数为可选参数,默认值为false,表示是否递归调用子节点的暂停/恢复操作.
    属性与方法列表
    cc.Event (事件类)

    cc.EventCustom (自定义事件)
    cc.EventCustom 继承自 cc.Event

    cc.EventMouse (鼠标事件)
    cc.EventMouse 继承自 cc.Event
    cc.EventTouch ()
    cc.EventTouch 继承自 cc.Event
    cc.EventListener (事件监听器)
    cc.EventListener.create 函数参数列表:
    创建EventListenerTouchOneByOne对象:
    event: cc.EventListener.TOUCH_ONE_BY_ONE
    可选参数:
  • swallowTouches,boolean,是否吞下该touch点
  • onTouchBegan,function,TouchBegan 事件回调
  • onTouchMoved,TouchMoved 事件回调
  • onTouchEnded,TouchEnded 事件回调
  • onTouchCancelled,TouchCancelled 事件回调

  • 创建EventListenerTouchAllAtOnce对象:
    event: cc.EventListener.TOUCH_ALL_AT_ONCE
  • onTouchesBegan,TouchesBegan 事件回调
  • onTouchesMoved,TouchesMoved 事件回调
  • onTouchesEnded,TouchesEnded 事件回调
  • onTouchesCancelled,TouchesCancelled 事件回调

  • 创建EventListenerKeyboard对象:
    event: cc.EventListener.KEYBOARD
  • onKeyPressed,KeyPressed (键按下) 事件回调
  • onKeyReleased,keyRelease (键放开) 事件回调

  • 创建EventListenerMouse对象:
    event: cc.EventListener.MOUSE
  • onMouseDown,MouseDown 事件回调
  • onMouseUp,MouseUp 事件回调
  • onMouseMove,MouseMove 事件回调
  • onMouseScroll,MouseScroll 事件回调

  • 创建EventListenerAcceleration对象:
    event: cc.EventListener.ACCELERATION
  • callback,Acclerometer 事件回调

  • 创建EventListenerCustom对象:
    event: cc.EventListener.CUSTOM
    cc.eventManager
    本文转载自: http://cocos2d-x.org/docs/manual/framework/html5/v3/eventManager/zh
    完整文档请参考: http://cocos2d-x.org/docs/manual/framework/html5/zh

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


        本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
    Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
    第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
        Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
    1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
       Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
     下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
    分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
    1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
    原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
    2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
    原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
    环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
    1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
    原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
    原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
    为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
    Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
    需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
    v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是