概念
cocos creator中的自定义事件类是cc.Event.EventCustom,类似于观察者模式
作用
能使发送者发送某一信号后,接受者能执行某一动作,能降低发送者和接受者之间的耦合度
场景假设
为方便后续的讨论,假设节点O上有两个脚本组件a、b,并假设在脚本a中监听脚本b中的事件
事件注册
脚本a中的代码
onLoad () {
this.node.parent.on("CustomName", function (event) {
let data = event.getUserData();
cc.log("已经获得:", data);
});
}
注意这里是在脚本a上绑定的节点的父节点,也就是节点O上注册监听事件。为什么要这么做呢?后面解释原因
例外,CustomName是自定义事件的事件名,后面的function (event)是回调函数,在接收到事件CustomName时被自动调用
事件分发
脚本b中的代码
onTouchStart(event){
let testEvent = new cc.Event.EventCustom("CustomName", true);//创建自定义事件
testEvent.setUserData("abc"); //设置自定义事件中包含的数据
this.node.dispatchEvent(testEvent); //用节点分发事件
}
注意,这里要通过脚本b上绑定的节点来分发事件
cc.Event.EventCustom
cc.Event.EventCustom是自定义事件类,其构造函数是constructor(type: string, bubbles: boolean)
其中type是自定义事件的标签,用来标识自己,bubbles标识是否进行冒泡传送
冒泡派送:事件从发起节点开始,不断迭代地向父节点传递,直到遇到根节点或者在响应函数中进行了中断处理的节点。
取消监听
脚本a中的代码
this.node.parent.off("CustomName"); //取消掉了对事件CustomName的监听
重要规律
分发事件后,只有本节点或者本节点的祖先节点能接受到事件分发的信号
因此如果在脚本a中用this.node.on来注册对事件CustomName的监听,是无法监听到事件CustomName的,必须使用其父节点来注册监听