zoukankan      html  css  js  c++  java
  • Cocos Creator中使用事件中心

    export class EventCenter {
        /** 监听数组 */
        private listeners = {};
    
        /** 
        * 注册事件
        * @param name 事件名称
        * @param callback 回调函数
        * @param context 上下文
        */
        public register(name: string, callback: Function, context: any) {
            let observers: Observer[] = this.listeners[name];
            if (!observers) {
                this.listeners[name] = [];
            }
            this.listeners[name].push(new Observer(callback, context));
        }
    
        /**
        * 移除事件
        * @param name 事件名称
        * @param callback 回调函数
        * @param context 上下文
        */
        public remove(name: string, context: any) {
            let observers: Observer[] = this.listeners[name];
            if (!observers) return;
            let length = observers.length;
            for (let i = 0; i < length; i++) {
                let observer = observers[i];
                if (observer.compar(context)) {
                    observers.splice(i, 1);
                    break;
                }
            }
            if (observers.length == 0) {
                delete this.listeners[name];
            }
        }
    
        /**
        * 发送事件
        * @param name 事件名称
        */
        public fire(name: string, ...args: any[]) {
            let observers: Observer[] = this.listeners[name];
            if (!observers) return;
            let length = observers.length;
            for (let i = 0; i < length; i++) {
                let observer = observers[i];
                observer.notify(name, ...args);
            }
        }
    }
    
    /*************************************************************/
    
    /**
    * 观察者
    */
    export class Observer {
        /** 回调函数 */
        private callback: Function = null;
        /** 上下文 */
        private context: any = null;
    
        constructor(callback: Function, context: any) {
            let self = this;
            self.callback = callback;
            self.context = context;
        }
    
        /**
        * 发送通知
        * @param args 不定参数
        */
        notify(...args: any[]): void {
            let self = this;
            self.callback.call(self.context, ...args);
        }
    
        /**
        * 上下文比较
        * @param context 上下文
        */
        compar(context: any): boolean {
            return context == this.context;
        }
    }
  • 相关阅读:
    HDU 1434 幸福列车(优先队列)
    HDU 4287 Intelligent IME(字典树)
    HDU 1671 Phone List(字典树)
    HDU 1711 Number Sequence(KMP匹配数字串)
    HDU 1251 统计难题(字典树计算前缀数量)
    HDU 2087 剪花布条(KMP基础应用)
    HRBUST 1909 理工门外的树(双数组实现线段树功能)
    HDU 1166 敌兵布阵(线段树)
    HDU 1754 I Hate It(线段树基础应用)
    HDU 1260 Tickets(基础dp)
  • 原文地址:https://www.cnblogs.com/steamedbun/p/10622928.html
Copyright © 2011-2022 走看看