系统内置事件

如上一篇文档所述,cc.Node有一套完整的事件监听和分发机制。在这套机制之上,我们提供了一些基础的系统事件,这篇文档将介绍这些事件的使用方式。

系统事件遵守通用的注册方式,开发者既可以使用枚举类型也可以直接使用事件名来注册事件的监听器,事件名的定义遵循 DOM 事件标准。

// 使用枚举类型来注册
node.on(cc.Node.EventType.MOUSE_DOWN,function (event) {
  console.log('Mouse down');
},this);
// 使用事件名来注册
node.on('mousedown',sans-serif; Box-sizing: border-Box; font-weight: bold;">this);

鼠标事件类型和事件对象

鼠标事件在桌面平台才会触发,系统提供的事件类型如下:

cc.Node.EventType.MOUSE_ENTER cc.Node.EventType.MOUSE_MOVE cc.Node.EventType.MOUSE_LEAVE cc.Node.EventType.MOUSE_UP cc.Node.EventType.MOUSE_WHEEL
枚举对象定义 对应的事件名 事件触发的时机
cc.Node.EventType.MOUSE_DOWN 'mousedown' 当鼠标在目标节点区域按下时触发一次
'mouseenter' 当鼠标移入目标节点区域时,不论是否按下
'mousemove' 当鼠标在目标节点在目标节点区域中移动时,不论是否按下
'mouseleave' 当鼠标移出目标节点区域时,不论是否按下
'mouseup' 当鼠标从按下状态松开时触发一次
'mousewheel' 当鼠标滚轮滚动时

鼠标事件(cc.Event.EventMouse)的重要 API 如下(cc.Event标准事件 API 之外):

函数名 getScrollY getLocation getLocationX getLocationY getPrevIoUsLocation getDelta getButton
返回值类型 意义
Number 获取滚轮滚动的 Y 轴距离,只有滚动时才有效
Object 获取鼠标位置对象,对象包含 x 和 y 属性
获取鼠标的 X 轴位置
获取鼠标的 Y 轴位置
获取鼠标事件上次触发时的位置对象,对象包含 x 和 y 属性
获取鼠标距离上一次事件移动的距离对象,对象包含 x 和 y 属性
cc.Event.EventMouse.BUTTON_LEFT或cc.Event.EventMouse.BUTTON_RIGHTcc.Event.EventMouse.BUTTON_MIDDLE

触摸事件类型和事件对象触摸事件在移动平台和桌面平台都会触发,这样做的目的是为了更好得服务开发者在桌面平台调试,只需要监听触摸事件即可同时响应移动平台的触摸事件和桌面端的鼠标事件。系统提供的触摸事件类型如下:

cc.Node.EventType.TOUCH_START cc.Node.EventType.TOUCH_MOVE cc.Node.EventType.TOUCH_END cc.Node.EventType.TOUCH_CANCEL
'touchstart' 当手指触点落在目标节点区域内时
'touchmove' 当手指在屏幕上目标节点区域内移动时
'touchend' 当手指在目标节点区域内离开屏幕时
'touchcancel' 当手指在目标节点区域外离开屏幕时

触摸事件(cc.Event.EventTouch)的重要 API 如下(API 名 类型 touch cc.Touch 与当前事件关联的触点对象 getID 获取触点的 ID,用于多点触摸的逻辑判断 获取触点位置对象,对象包含 x 和 y 属性 获取触点的 X 轴位置 获取触点的 Y 轴位置 获取触点上一次触发事件时的位置对象,对象包含 x 和 y 属性 getStartLocation 获取触点初始时的位置对象,对象包含 x 和 y 属性 获取触点距离上一次事件移动的距离对象,对象包含 x 和 y 属性

需要注意的是,触摸事件支持多点触摸,每个触点都会发送一次事件给事件监听器

鼠标和触摸事件冒泡鼠标和触摸事件均支持节点树的事件冒泡,以下图为例:

在图中的场景里,A节点拥有一个子节点B,B拥有一个子节点C。假设开发者对A、B、C都监听了触摸事件。当鼠标或手指在B节点区域内按下时,事件将首先在B节点触发,B节点监听器接收到事件。接着B节点会将事件向其父节点传递这个事件,A节点的监听器将会接收到事件。这就是最基本的事件冒泡过程。

当鼠标或手指在C节点区域内按下时,事件将首先在C节点触发并通知C节点上注册的事件监听器。C节点会通知B节点这个事件,B节点内逻辑会负责检查触点是否发生在自身区域内,如果是则通知自己的监听器,否则什么都不做。紧接着A节点会收到事件,由于C节点完整处在A节点中,所以注册在A节点上的事件监听器都将收到触摸按下事件。以上的过程解释了事件冒泡的过程和根据节点区域来判断是否分发事件的逻辑。

除了根据节点区域来判断是否分发事件外,鼠标和触摸事件的冒泡过程与普通事件的冒泡过程并没有区别。所以,调用eventstopPropagation函数可以主动停止冒泡过程。

cc.Node的其它事件

枚举对象定义 无 'rotation-changed' 'scale-changed' 'size-changed' 'anchor-changed'
对应的事件名 事件触发的时机
'position-changed' 当位置属性修改时
当旋转属性修改时
当缩放属性修改时
当宽高属性修改时
当锚点属性修改时

玩家输入事件

本篇教程,我们将介绍 Cocos Creator 的玩家输入事件。

目前支持了以下几种事件:

  • 键盘事件
  • 鼠标事件
  • 触摸事件
  • 设备重力传感事件

注意:目前已经不建议直接使用 cc.eventManager 来注册任何事件,cc.eventManager 的用法也不保证持续性,有可能随时被修改

如何定义输入事件

除了键盘、设备重力传感器事件是通过函数cc.systemEvent.on(type,callback,target)注册以外 其他的例如:鼠标事件与触摸事件请参考系统内置事件

可选的type类型有:

  1. cc.SystemEvent.EventType.KEY_DOWN (键盘按下)
  2. cc.SystemEvent.EventType.KEY_UP (键盘释放)
  3. cc.SystemEvent.EventType.DEVICEMOTION (设备重力传感)

键盘事件

  • 事件监听器类型:cc.SystemEvent.EventType.KEY_DOWNcc.SystemEvent.EventType.KEY_UP
  • 事件触发后的回调函数:
    • 自定义回调函数:callback(event);
  • 回调参数:
    • KeyCode:API 传送门
    • Event:API 传送门
cc.Class({
    extends: cc.Component,onLoad: function () {
        // add key down and key up event
        cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN,sans-serif; Box-sizing: border-Box; font-weight: bold;">this.onKeyDown,sans-serif; Box-sizing: border-Box; font-weight: bold;">this);
        cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP,sans-serif; Box-sizing: border-Box; font-weight: bold;">this.onKeyUp,sans-serif; Box-sizing: border-Box; font-weight: bold;">this);
    },destroy () {
        cc.systemEvent.off(cc.SystemEvent.EventType.KEY_DOWN,sans-serif; Box-sizing: border-Box; font-weight: bold;">this);
        cc.systemEvent.off(cc.SystemEvent.EventType.KEY_UP,onKeyDown: function (event) {
        switch(event.keyCode) {
            case cc.KEY.a:
                'Press a key');
                break;
        }
    },onKeyUp: 'release a key');
                break;
        }
    }
});

鼠标事件

  • 事件监听器类型:cc.EventListener.MOUSE
  • 事件触发后的回调函数:
    • 鼠标按下:onMouseDown(event);
    • 鼠标释放:onmouseup(evnet);
    • 鼠标移动:onMouseMove(evnet);
    • 鼠标滚轮:onMouseScroll(evnet);
  • 回调参数:
    • Event:API 传送门
// 添加鼠标事件监听器
var listener = {
    event: cc.EventListener.MOUSE,onMouseDown: function (event) {
        cc.log('Mouse Down: ' + event);
    },onmouseup: 'Mouse Up: ' + event);
    },
    onMouseMove: event) {
       cc.log('Mouse Move: ' + event);
    }
    onMouseScroll: 'Mouse Scroll: ' + event);
    }
}
// 绑定鼠标事件
cc.eventManager.addListener(listener,this.node);

单点触摸事件

  • 事件监听器类型:cc.EventListener.TOUCH_ONE_BY_ONE
  • 事件触发后的回调函数:
    • 触摸开始:onTouchBegan(touches,event);
    • 触摸移动时:onTouchMoved(touches,event);
    • 触摸结束时:onTouchEnded(touches,event);
    • 取消触摸:onTouchCancelled(touches,event);
  • 回调参数:
    • touches: 触摸点的列表,单个TouchAPI 传送门
    • Event:API 传送门

注意:onTouchBegan回调事件里要return true, 这样后续的onTouchEndedonTouchMoved才会触发事件。

// 添加单点触摸事件监听器
var listener = {
    event: cc.EventListener.TOUCH_ONE_BY_ONE,onTouchBegan: touches,event) {
        cc.log('Touch Began: ' + event);
        return true; //这里必须要写 return true
    },onTouchMoved: 'Touch Moved: ' + event);
    },
    onTouchEnded: 'Touch Ended: ' + event);
    }
    onTouchCancelled: 'Touch Cancelled: ' + event);
    }
}
// 绑定单点触摸事件
cc.eventManager.addListener(listener,136); font-weight: bold;">this.node);

多点触摸事件cc.EventListener.TOUCH_ALL_AT_ONCE

  • 事件触发后的回调函数:
    • 触摸开始:onTouchesBegan(touches,event);
    • 触摸移动时:onTouchesMoved(touches,event);
    • 触摸结束时:onTouchesEnded(touches,event);
    • 取消触摸:onTouchesCancelled(touches,sans-serif; font-size: 16px; line-height: 25.6px;">同理:onTouchesBegan回调事件里也要onTouchesEndedonTouchesMoved才会触发事件。
      // 添加多点触摸事件监听器
      var listener = {
          event: cc.EventListener.TOUCH_ALL_AT_ONCE,onTouchesBegan: // touches 触摸点的列表
              cc.log('Touch Moved: ' + event);
          },
          onTouchesEnded: 'Touch Ended: ' + event);
          }
          onTouchesCancelled: // 绑定多点触摸事件
      cc.eventManager.addListener(listener,136); font-weight: bold;">this.node);

  • 设备重力传感事件

    • 事件监听器类型:cc.SystemEvent.EventType.DEVICEMOTION
    • 事件触发后的回调函数:
      • 自定义回调函数:callback(event);;
    • 回调参数:
      • Event:API 传送门
    // open Accelerometer
            cc.inputManager.setAccelerometerEnabled(true);
            cc.systemEvent.on(cc.SystemEvent.EventType.DEVICEMOTION,sans-serif; Box-sizing: border-Box; font-weight: bold;">this.onDeviceMotionEvent,destroy () {
            cc.systemEvent.off(cc.SystemEvent.EventType.DEVICEMOTION,onDeviceMotionEvent (event) {
            cc.log(event.acc.x + " " + event.acc.y);
        },});

    大家可以也去看官方范例cases03_gameplay/01_player_control目录下的完整范例(这里包含了,键盘,重力感应,单点触摸,多点触摸的范例)。

    Cocos Creator系统内置事件和玩家输入事件(官方文档摘录)的更多相关文章

    1. 详解使用postMessage解决iframe跨域通信问题

      这篇文章主要介绍了详解使用postMessage解决iframe跨域通信问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    2. HTML5数字输入仅接受整数的实现代码

      这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    3. HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码

      这篇文章主要介绍了HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

    4. 浅谈html5之sse服务器发送事件EventSource介绍

      本篇文章主要介绍了浅谈html5之sse服务器发送事件EventSource介绍,具有一定的参考价值,有兴趣的可以了解一下

    5. HTML5 拖放(Drag 和 Drop)详解与实例代码

      本篇文章主要介绍了HTML5 拖放(Drag 和 Drop)详解与实例代码,具有一定的参考价值,有兴趣的可以了解一下

    6. ios – Swift中的非响应流委托

      所以我在Swift中使用套接字并试图将应用程序与我的服务器连接起来.我让应用程序连接到服务器的IP地址,并在服务器上使用netcat进行测试.在执行期间,应用程序的控制台输出显示它已成功连接到服务器.但是,流委托似乎没有响应.当我输入netcat时,app控制台没有打印任何内容.我已经搜索了很长一段时间,发现我的实现与其他实现非常相似.也许我在这里遗漏了一些我看不到的东西.任何想到这个问题的人都将不胜感激!

    7. ios – UIScrollView内容不允许用户交互

      我有一个启用了分页的UIScrollView,如下所示:在UIScrollView中,我添加了几个UIWebViews,并将其启用的交互设置为是这样的.它打破了UIScrollView上的分页和所有触摸.如果我将用户交互设置为NO,则页面有效,但我无法在UIWebView中突出显示文本.我试着像下面那样对UIScrollView进行子类化,但是会出现同样的情况.任何的想法?

    8. ios – 如何知道用户在iPhone中的播放控件上单击快进和快退按钮

      还是有其他方法吗?

    9. ios – 如何在使用隐式动画为CALayer设置动画时继承动画属性

      我试图使用隐式动画在CALayer上设置自定义属性的动画:在-actionForKey:方法我需要返回动画,负责插值.当然,我必须以某种方式告诉动画如何检索动画的其他参数.有关如何实现这一点的任何想法?

    10. ios – touchesMoved在iPhone 6s及以后的单点击中被调用

      解决方法可能是更高分辨率的屏幕对任何移动都更敏感.当你敲击时,你实际上可能正在滚动你的手指,使它看起来像一个小动作.两种可能的解决方>在touchesMoved:方法中检查触摸移动了多远.如果这是一个非常小的举动,请忽略它以进行_isTapped检查.>而不是覆盖触摸…

    随机推荐

    1. 【cocos2d-x 3.x 学习笔记】对象内存管理

      Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

    2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

      由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

    3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

      在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

    4. cocos2dx3.x 新手打包APK注意事项!

      这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

    5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

      如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

    6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

      needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

    7. 02 Cocos2D-x引擎win7环境搭建及创建项目

      官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

    8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

      一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

    9. 03 Helloworld

      程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

    10. MenuItemImage*图标菜单创建注意事项

      学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

    返回
    顶部