Cocos Creator系统内置事件和玩家输入事件(官方文档摘录)
|
cc.Touch | 与当前事件关联的触点对象 |
获取触点的 ID,用于多点触摸的逻辑判断 | ||
获取触点初始时的位置对象,对象包含 x 和 y 属性 | ||
需要注意的是,触摸事件支持多点触摸,每个触点都会发送一次事件给事件监听器。
鼠标和触摸事件冒泡鼠标和触摸事件均支持节点树的事件冒泡,以下图为例:
在图中的场景里,A节点拥有一个子节点B,B拥有一个子节点C。假设开发者对A、B、C都监听了触摸事件。当鼠标或手指在B节点区域内按下时,事件将首先在B节点触发,B节点监听器接收到事件。接着B节点会将事件向其父节点传递这个事件,A节点的监听器将会接收到事件。这就是最基本的事件冒泡过程。
当鼠标或手指在C节点区域内按下时,事件将首先在C节点触发并通知C节点上注册的事件监听器。C节点会通知B节点这个事件,B节点内逻辑会负责检查触点是否发生在自身区域内,如果是则通知自己的监听器,否则什么都不做。紧接着A节点会收到事件,由于C节点完整处在A节点中,所以注册在A节点上的事件监听器都将收到触摸按下事件。以上的过程解释了事件冒泡的过程和根据节点区域来判断是否分发事件的逻辑。
除了根据节点区域来判断是否分发事件外,鼠标和触摸事件的冒泡过程与普通事件的冒泡过程并没有区别。所以,调用event
的stopPropagation
函数可以主动停止冒泡过程。
cc.Node
的其它事件
对应的事件名 | 事件触发的时机 |
---|---|
'position-changed' | 当位置属性修改时 |
当旋转属性修改时 | |
当缩放属性修改时 | |
当宽高属性修改时 | |
当锚点属性修改时 |
玩家输入事件
本篇教程,我们将介绍 Cocos Creator 的玩家输入事件。
目前支持了以下几种事件:
- 键盘事件
- 鼠标事件
- 触摸事件
- 设备重力传感事件
注意:目前已经不建议直接使用 cc.eventManager 来注册任何事件,cc.eventManager 的用法也不保证持续性,有可能随时被修改
如何定义输入事件
除了键盘、设备重力传感器事件是通过函数cc.systemEvent.on(type,callback,target)
注册以外 其他的例如:鼠标事件与触摸事件请参考系统内置事件。
可选的type
类型有:
- cc.SystemEvent.EventType.KEY_DOWN (键盘按下)
- cc.SystemEvent.EventType.KEY_UP (键盘释放)
- cc.SystemEvent.EventType.DEVICEMOTION (设备重力传感)
键盘事件
- 事件监听器类型:
cc.SystemEvent.EventType.KEY_DOWN
和cc.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.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
, 这样后续的onTouchEnded
和onTouchMoved
才会触发事件。
// 添加单点触摸事件监听器
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
回调事件里也要onTouchesEnded
和onTouchesMoved
才会触发事件。// 添加多点触摸事件监听器 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
目录下的完整范例(这里包含了,键盘,重力感应,单点触摸,多点触摸的范例)。