Cocos 自定义事件(TypeScript)
这个东西就是一个自定义的事件类,有监听注册删除等函数。好处就是在注册事件的时候不用传结点信息,换成了字符串,还有个好处就是切场景不会自动删除注册的信息。(我也不知道是优点还是缺点。。)
然后就上代码嘞!!!
export class EventTpye {
public static readonly TestEvent: string = "TestEvent";
}
export class MyEvent {
/**存储 */
list: any = {};
/**
* 注册消息
* @param key key
* @param func 回调
* @param type 区别其他key值相同的注册
*/
on(key: string, func: Function, type: string) {
if (this.list[key] == null) {
this.list[key] = [];
}
let d: any = {};
d.func = func;
d.type = type;
(this.list[key]).push(d);
}
/**
* 移除一个消息
*/
remove(key: string, type: string) {
if (this.list[key]) {
let data = this.list[key];
for (let i = 0; i < data.length; i++) {
if (data[i].type == type) {
data.splice(i, 1);
--i;
}
}
}
}
/**
* 移除type相同的所有消息
*/
removeByNode(type: string) {
for (let p in this.list) {
let data = this.list[p];
for (let i = 0; i < data.length; i++) {
if (data[i].type == type) {
data.splice(i, 1);
--i;
}
}
}
}
/**
* 移除key注册的所有消息
*/
removeByKey(key: string) {
delete this.list[key];
}
/**
* 派发消息
*/
emit(key: string, arg?: any) {
if (this.list[key]) {
let funcs = this.list[key].concat();
for (let i = 0; i < funcs.length; i++) {
if (funcs[i].type && isValid(funcs[i].type)) {
funcs[i].func(arg, funcs[i].type);
}
}
}
}
private static singleton: MyEvent;
public static get I(): MyEvent {
if (!this.singleton) {
this.singleton = new MyEvent();
}
return this.singleton;
}
}
!!总结一下用这个东西需要注意的地方!!
1.注册的时候不需要传node但是要传一个type,type是string类型的!!
2.注册完之后如果不需要了,要手动删除,要手动删除,要手动删除
3.如果监听的那个结点被删了(切换场景了),虽然可以监听到派发的消息,但是公有变量会是空的,至于再切换回原场景会不会恢复,我可以明确的告诉你 我没试。(如果是调用需要被删除的结点中的信息,我建议还是养成删除监听事件的好习惯。。)