123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- import { _decorator, Component, Node } from 'cc';
- import { Singleton } from '../manager/Singleton';
- const { ccclass, property } = _decorator;
- /*
- //注册事件
- EventEmitter.instance.register(this, "PLAYER_DEAD", (reason: string) => {
- console.log("~~:", reason);
- });
- //派发事件
- EventEmitter.instance.dispatch("PLAYER_DEAD", "被怪物击杀");
- //注销事件
- EventEmitter.instance.unregister(this, "PLAYER_DEAD");*/
- /**事件数据接口*/
- interface IEventData {
- func: Function; // 回调函数
- target: any; // 回调函数绑定的this对象
- }
- /**事件哈希表接口*/
- interface IEventHash {
- [eventType: string]: IEventData[]; //事件类型到事件数据数组的映射
- }
- @ccclass('EventEmitter')
- class EventEmitter extends Singleton {
- private eventHash: IEventHash = {};
- /**
- * 清空所有事件监听
- */
- public clearAll(): void {
- console.log("清空所有事件监听");
- this.eventHash = {};
- }
- /**
- * 注册事件监听
- * @param target 监听对象 (用于取消监听时识别)
- * @param type 事件类型
- * @param callback 回调函数
- */
- public register(target: any, type: string, callback: Function): void {
- if(!this.eventHash[type]) {
- this.eventHash[type] = [];
- }
- //检查是否已注册相同监听
- const exists = this.eventHash[type].some(
- event => event.func === callback && event.target === target
- );
- if(!exists) {
- this.eventHash[type].push({
- func: callback,
- target: target
- });
- }
- }
- /**
- * 注销事件监听
- * @param target 监听对象
- * @param type 事件类型
- */
- public unregister(target: any, type: string): void {
- const events = this.eventHash[type];
- if (events && events.length > 0) {
- for (let i = events.length - 1; i >= 0; i--) {
- if (events[i].target === target) {
- events.splice(i, 1);
- }
- }
- }
- }
- /**
- * 派发事件
- * @param type 事件类型
- * @param data 事件数据 (可变参数)
- */
- public dispatch(type: string, ...data: any[]): void {
- const events = this.eventHash[type];
- if (events && events.length > 0) {
- // 使用slice创建副本,防止在回调中修改数组影响遍历
- events.slice().forEach(event => {
- try {
- event.func.apply(event.target, data);
- } catch (error) {
- console.error(`事件[${type}]处理错误:`, error);
- }
- });
- }
- }
- }
- //单例
- export const eventEmitter = EventEmitter.ins();
|