# 事件监听与派发
事件处理是在节点中完成的, 对于脚本组件, 可以通过访问节点this.node来完成事件注册与监听
* 事件监听
API: this.node.on(EventName, callBack, this);
* 关闭监听
// cocos建议关闭监听时写全所有参数
API: this.node.off(EventName, callBack, this);
* 事件派发两种形式
1. emit派发: this.node.emit('eventName', arge); 特别说明: 从第二个参数起,我们可以给监听器传参, 出于底层性能考虑, 最多只支持5个参数。
2. dispatchEvent派发 : 会进行事件传递, 以冒泡形式派送, 直到遇到stopPropagation()结束冒泡, 本页面的监听依旧触发。
API: this.node.dispatchEvent(new cc.Event.EventCustom(EventName, true));
注意: 在发送用户自定义事件的时候, 请不要直接创建cc.Event对象, 它是一个抽象类, 要用cc.Event.EventCustom()对象进行派发。
* 鼠标事件与触摸事件
节点事件可用枚举类型来注册,也可用事件名来注册
枚举类型:全名; 事件名:别名。
1. 鼠标事件 - 针对PC端, 在移动端不会触发,
* cc.Node.EventType.MOUSE_DOWN: 鼠标按下监听
* cc.Node.EventType.MOUSE_UP: 鼠标弹起监听
* cc.Node.EventType.MOUSE_lEAVE: 鼠标离开节点时触发
* cc.Node.EventType.MOUSE_ENTER 鼠标进入节点时触发
* cc.Node.EventType.MOUSE_MOVE: 鼠标移动时触发
* cc.Node.EventType.MOUSE_WHEEL: 鼠标滚轮滑动时触发
2. 触摸事件 - 针对移动端, 但在pc端也会触发, 方便调试
* cc.Node.EventType.TOUCH_START 手指摁下
* cc.Node.EventType.TOUCH_END 手指在节点上抬起
* cc.Node.EventType.TOUCH_MOVE 手指在节点上移动
* cc.Node.EventType.TOUCH_CANCEL 手指在节点外离开屏幕时
* 触摸事件的事件冒泡与捕获
触摸事件会自动进行冒泡。 点击子元素, 不管是否点击区域在不在父元素内, 都会触发父级监听的同类事件, 可用event.stopPorpagation()方法停止冒泡。
我们也可以将事件注册在节点的捕获状态,这样就会提前触发在父元素的事件。
捕获事件API: this.node.on('touchstart', this.onStart, this, ture); // 只需在注册事件时传入第四个参数为true即可。
* 同级节点之间触摸事件归属问题
同级节点之间, 不会进行事件传递, 谁层级在上面, 就触发谁的事件, 下面的事件不会触发。
* 节点的其他事件
当节点属性改变时, 我们也可以注册事件监听。 没有枚举类型, 只有事件名
* position-changed 当位置属性改变时
* rotation-changed 当旋转属性改变时
* scale-changed 当缩放属性改变时
* size-changed 当宽高属性改变时
* anchor-changed
* 全局系统事件, 分为输入事件与设备重力传感事件, 与节点树无关, 由cc.sysemEvent统一派发
共有三种事件类型: * cc.SystemEvent.EventType.KEY_DOWN 键盘按下
* cc.SystemEvent.EventType.KEY_UP 键盘弹起
* cc.SystemEvent.EventType.DEVICEMOTION 设备重力感应
* 输入事件,监听键盘
API: cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
onKeyDown(event) {
switch(event.keyCode) {
case: cc.macro.KEY.a:
// todo 点击a键
break;
}
}
* 重力传感事件 cc.systemEvent.EventType.DEVICEMOTION
用法: // open Accelerometer
cc.systemEvent.setAccelerometerEnabled(true);
// 注册监听
cc.systemEvent.on(cc.SystemEvent.EventType.DEVICEMOTION, this.onDeviceMotion, this);
onDeviceMotion(event) {
console.log(event.acc.x + " " + event,acc.y);
}