个人接触ccc事件并不长,通过看视频教程以及官方文档进行学习。
现在自己从零开始写一个游戏的时候,用到比较多的事件注册和分发,感觉事件注册和分发使用起来不是很方便,因为总是会在不同的地方注册事件,在不同的地方发送事件,所以在想能否统一注册、分发事件。
jQuery的事件注册与分发让我受到了启发,就心血来潮写了一个事件注册分发的工具,由于刚接触ccc不久,或许有更好的实现方式,到时还希望大家能够告诉我。
不多说,下面直接上代码:
/**
* 事件绑定
* func支持两种类型:
* 1.func为函数,直接将此函数绑定到事件
* 2.func为字符串,值必须为node上脚本组件中函数名,若同一node上有多个脚本组件,请保证该函数名唯一
* @param targetNode 接收事件节点
* @param eventType 事件类型
* @param func 处理函数
*/
export function on(targetNode:cc.Node,eventType:string,func:Function|string) {
if(func instanceof Function){
targetNode.on(eventType,func);
}else{
let jsArray = targetNode.getComponents(cc.Component);
if(jsArray){
for (let i = 0; i < jsArray.length; i++) {
const js = jsArray[i];
if(js[func]){
targetNode.on(eventType,js[func].bind(js));
break;
}
}
}
}
}
/**
* 事件绑定(执行一次则删除)
* func支持两种类型:
* 1.func为函数,直接将此函数绑定到事件
* 2.func为字符串,值必须为node上脚本组件中函数名,若同一node上有多个脚本组件,请保证该函数名唯一
* @param targetNode 接收事件节点
* @param eventType 事件类型
* @param func 处理函数
*/
export function once(targetNode:cc.Node,eventType:string,func:Function|string) {
if(func instanceof Function){
targetNode.once(eventType,func);
}else{
let jsArray = targetNode.getComponents(cc.Component);
if(jsArray){
for (let i = 0; i < jsArray.length; i++) {
const js = jsArray[i];
if(js[func]){
targetNode.once(eventType,js[func].bind(js));
break;
}
}
}
}
}
/**
* 关闭事件监听
* @param targetNode 接收事件节点
* @param eventType 事件类型
* @param func 处理函数
*/
export function off(targetNode:cc.Node,eventType:string,func:Function|string){
if(func instanceof Function){
targetNode.off(eventType,func);
}else{
let jsArray = targetNode.getComponents(cc.Component);
if(jsArray){
for (let i = 0; i < jsArray.length; i++) {
const js = jsArray[i];
if(js[func]){
targetNode.off(eventType,js[func].bind(js));
break;
}
}
}
}
}
/**
* 事件发送 emit
* 事件处理函数接收参数为data
* @param targetNode 接收事件节点
* @param eventType 事件类型
* @param data 自定义数据
*/
export function emit(targetNode:cc.Node,eventType:string,data:any) {
targetNode.emit(eventType,data);
}
/**
* 事件发送 dispatchEvent
* 事件处理函数接收参数为cc.Event.EventCustom类型,可通过event.getUserData()获取自定义参数
* @param targetNode 接收事件节点
* @param eventType 事件类型
* @param data 自定义数据
*/
export function dispatchEvent(targetNode:cc.Node,eventType:string,data:any) {
let event = new cc.Event.EventCustom(eventType, true);
event.setUserData(data);
targetNode.dispatchEvent(event);
}