全局系统事件

本篇教程,我们将介绍 Cocos Creator 的全局系统事件。

全局系统事件是指与节点树不相关的各种全局事件,由 systemEvent 来统一派发,目前支持了以下几种事件:

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

其中,鼠标事件与触摸事件同节点系统事件类似,只是在于作用的区域不同。接下来会围绕这几个事件做个说明。

节点事件和全局鼠标/触摸事件的区别

在开始这部分内容之前,希望大家先提前阅读一下 多分辨率适配方案,了解屏幕区域和 UI 显示区域。当监听全局鼠标/触摸事件的时候,所获取到的触点是基于屏幕区域(设备显示分辨率)左下角计算的。而 UI 节点监听获取到的触点,是将全局事件获取到的触点,转换到适配后的 UI 可视区域左下角计算出的点,这两个点是不一样的。全局触点比较适用于直接点击屏幕去操控 3D 节点的行为,而不需要为场景添加 UI 节点去做鼠标/触摸事件的监听。

如何定义输入事件

键盘、设备重力传感器此类全局事件是通过函数 systemEvent.on(type, callback, target) 注册的。

可选的 type 类型有:

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

键盘事件

  • 事件监听器类型:SystemEvent.EventType.KEY_DOWNSystemEvent.EventType.KEY_UP
  • 事件触发后的回调函数:
    • 自定义回调函数:callback(event);
  • 回调参数:
  1. import { _decorator, Component, Node, systemEvent, SystemEvent, EventKeyboard, KeyCode } from 'cc';
  2. const { ccclass } = _decorator;
  3. @ccclass("Example")
  4. export class Example extends Component {
  5. onLoad () {
  6. systemEvent.on(SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
  7. systemEvent.on(SystemEvent.EventType.KEY_UP, this.onKeyUp, this);
  8. }
  9. onDestroy () {
  10. systemEvent.off(SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
  11. systemEvent.off(SystemEvent.EventType.KEY_UP, this.onKeyUp, this);
  12. }
  13. onKeyDown (event: EventKeyboard) {
  14. switch(event.keyCode) {
  15. case KeyCode.KEY_A:
  16. console.log('Press a key');
  17. break;
  18. }
  19. }
  20. onKeyUp (event: EventKeyboard) {
  21. switch(event.keyCode) {
  22. case KeyCode.KEY_A:
  23. console.log('Release a key');
  24. break;
  25. }
  26. }
  27. }

设备重力传感事件

  • 事件监听器类型:SystemEvent.EventType.DEVICEMOTION
  • 事件触发后的回调函数:
    • 自定义回调函数:callback(event);
  • 回调参数:
  1. import { _decorator, Component, Node, systemEvent, SystemEvent, log } from 'cc';
  2. const { ccclass } = _decorator;
  3. @ccclass("Example")
  4. export class Example extends Component {
  5. onLoad () {
  6. systemEvent.setAccelerometerEnabled(true);
  7. systemEvent.on(SystemEvent.EventType.DEVICEMOTION, this.onDeviceMotionEvent, this);
  8. }
  9. onDestroy () {
  10. systemEvent.off(SystemEvent.EventType.DEVICEMOTION, this.onDeviceMotionEvent, this);
  11. }
  12. onDeviceMotionEvent (event: EventAcceleration) {
  13. log(event.acc.x + " " + event.acc.y);
  14. }
  15. }

具体使用方法可参考范例 eventGitHub | Gitee),包含了键盘、重力感应、单点触摸、多点触摸等功能的实现。