Cocos Creator开发中的事件响应

在Cocos Creator游戏开发中,我们经常需要处理事件响应。所以,我们有必要对其中的事件响应内容熟记于心,因此,将其中重要内容归纳如下:

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀~

  1. 触摸事件

1: 触摸事件类型: START, MOVED, ENDED(物体内), CANCEL(物体外);

2: 监听触摸事件: node.on(类型, callback, target(回掉函数的this), [useCapture]);

3: 关闭触摸事件: node.off(类型, callback, target(回掉函数的this), [useCapture]);

4: 移除所有的注册事件:targetOff (target) ;

5: 回调函数的参数设置 function(e(cc.Touch))

6: cc.Touch: 触摸对象,

常用方法getLocation返回触摸的位置;getDelta返回距离上次的偏移;

7: cc.Event: stopPropagationImmediate/stopPropagation 停止事件的传递;

8: 事件冒泡: 触摸事件支持节点树的事件冒泡,会从当前节点往上一层一层的向父节点传送;

如下案例,物体跟随手指触摸移动实现:

GameMgr.ts代码如下:

const {ccclass, property} = cc._decorator;

@ccclass

export default class GameMgr extends cc.Component {

@property({type:cc.Node, tooltip:"要控制的主角节点",})

player : cc.Node = null;

onLoad () {

// 触摸到哪红色块就到哪

this.node.on(cc.Node.EventType.TOUCH_START, function(e : cc.Touch){

let worldPos : cc.Vec2 = e.getLocation();

let localPos : cc.Vec2 = this.node.convertToNodeSpaceAR(worldPos);

this.player.setPosition(localPos);

}, this);

// 红色块随着触摸移动

this.node.on(cc.Node.EventType.TOUCH_MOVE, (e : cc.Touch)=>{

let pos : cc.Vec2 = this.player.getPosition();

this.player.setPosition(pos.add(e.getDelta()));

}, this);

this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);

this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onTouchEnd, this);

}

private onTouchCancel() : void{

console.log("在节点之外释放鼠标!");

}

private onTouchEnd(e : cc.Touch) : void{

console.log("在节点之内释放鼠标");

}

onDestroy(){

this.node.off(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);

this.node.off(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);

}

}

  1. 键盘事件

1:cc.SystemEvent.on(type, function, target, useCapture);

type: cc.SystemEvent.EventType.KEY_DOWN 按键按下;

cc.SystemEvent.EventType.KEY_UP 按键弹起;

2: cc.SystemEvent.on(type, function, target, useCapture);

3: 监听的时候,我们需要一个cc.SystemEvent类的实例,我们有一个全局的实例cc.systemEvent,小写开头

3: 键盘回调函数: function(event) {

event.keyCode [cc.KEY.left, ...cc.KEY.xxxx]

案例:按上下左右键,控制红色块的运动。

新建PlayerCtrl.ts,挂载到Red节点上。代码如下:

const {ccclass, property} = cc._decorator;

@ccclass

export default class PlayerCtrl extends cc.Component {

start () {

// 按键按下时调用

cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);

// 按键释放时才调用

cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this);

}

private onKeyDown(e : any){

switch(e.keyCode){

case cc.macro.KEY.up : this.node.y += 100; break;

case cc.macro.KEY.down : this.node.y -= 100; break;

}

}

private onKeyUp(e : any){

switch(e.keyCode){

case cc.macro.KEY.left : this.node.x -= 100; break;

case cc.macro.KEY.right : this.node.x += 100; break;

}

}

}

  1. 自定义事件

1: 监听: this.node.on(“自定义事件名称”, function, target, useCapture);

2: 自派送: emit(“事件名称”, [detail]); 只有自己能够收到;

3: 冒泡派送: dispatchEvent(new cc.Event.EventCustom(“name”, 是否冒泡传递));

  1. 自派送emit

新建单色节点Blue,创建CustomEventTest.ts挂载到此节点上。

const {ccclass, property} = cc._decorator;

@ccclass

export default class CustomEventTest extends cc.Component {

onLoad () {

// 事件接收处理

this.node.on("SEND_EVENT", (e)=>{

console.log("emit方法派发事件SEND_EVENT", e, e.role);

}, this);

this.node.emit("SEND_EVENT", {role: this.node.name});

}

}

运行结果如下:

注意:此时,如果我们要在其父节点Canvas节点下也能接收到此SEND_EVENT事件,我们会设想,在GameMgr.ts中增加如下代码,但是事实上,运行后,GameMgr.ts的如下代码没有接收到派发事件。

运行结果如下(说明依然只有Blue自己这个节点接收到了emit派发的事件SEND_EVENT):

说明:如果派送的事件不只是发给自己,需要向上传递,则需要使用dispatchEvent。

  1. 冒泡派送dispatchEvent

在CustomEventTest.ts中增加start方法如下:

同时将GameMgr.ts中的方法略作修改如下:

然后,运行结果如下:

注意:若将CustomEventTest.ts中的事件冒泡属性改为false,如下,表示不冒泡传递,则其父节点Canvas将收不到派发的事件。

若将CustomEventTest.ts中的将start方法注释掉,则运行结果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FairyGUI和CocosCreator是两个不同的UI开发框架,各自拥有自己的事件系统。如果需要在项目混用这两个框架,我们可以通过一些方法来实现。 首先,要明确的是FairyGUI使用的是自己的事件系统,而CocosCreator使用的是基于节点的事件系统。因此,在混用这两个框架时,我们需要使用CocosCreator事件系统来处理整个场景除了FairyGUI组件外的事件,而使用FairyGUI的事件系统来处理FairyGUI组件上的事件。 具体操作上,我们可以在CocosCreator项目创建一个节点来展示FairyGUI的UI界面。在这个节点上,我们可以为其挂载一个脚本,以处理该节点上的CocosCreator事件。同时,我们可以在FairyGUI,为需要响应的组件添加点击事件的回调函数,并由这些回调函数来处理FairyGUI组件上的事件。 当用户点击FairyGUI组件时,由于FairyGUI具有自己的事件系统,该点击事件会被FairyGUI捕捉到并触发相应的回调函数。而对于CocosCreator的其他节点,点击事件会被CocosCreator事件系统捕捉到并触发相应的回调函数。我们可以在CocosCreator事件处理函数调用FairyGUI的事件处理函数,来实现整个场景的事件处理机制。 总之,通过使用CocosCreator事件系统处理除FairyGUI外的事件,再使用FairyGUI的事件系统处理FairyGUI组件上的事件,我们可以在项目混用这两个框架,实现更加灵活多样的交互效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值