当前位置: 首页 > article >正文

【cocos creator】【ts】事件派发系统

触发使用:
EventTool.emit(“onClick”)
需要监听的地方,onload调用:
EventTool.on(“onClick”, this.onClickEvent, this)


/**事件派发*/

class EventTool {

    protected static _instance: EventTool = null;

    public static get Instance(): EventTool {
        if (EventTool._instance == null) {
            EventTool._instance = new EventTool();
        }
        return EventTool._instance;
    }

    isValidNode(node) {
        return node && node.isValid;
    }
    /**添加事件监听  
     * @param {string} event 事件名  
     * @param {Function} handler 事件响应函数  
     * @param {object} scope 函数所在的对象
     */
    on(event: any, handler: Function, scope: any) {
        if (typeof handler != "function") {
            console.error("没有事件响应函数!", event);
            return;
        }
        let id = scope.uuid || scope.__custom_id__;
        if (!id) {
            scope.__custom_id__ = "" + Date.now() + Math.random();
            id = scope.__custom_id__;
        }
        this[id] = this[id] == undefined ? [] : this[id];
        if (Array.isArray(this[id])) {
            this[id].push(event);
        } else {
            console.error("有一个跟当前脚本同名的事件!");
            return;
        }
        this[event] = this[event] ? this[event] : {};
        this[event][id] = { handler: handler, scope: scope, times: cc.macro.REPEAT_FOREVER };
    }

    onOnce(event, handler, scope) {
        this.on(event, handler, scope)
        let id = scope.uuid || scope.__custom_id__;
        this[event][id].times = 1
    }

    /**
     * 移除事件监听
     * @param scope 
     * @param event event 为空则移除scope所有监听
     */
    off(scope?: any, event?: any) {
        let id = scope.uuid || scope.__custom_id__;
        if (!id) {
            return;
        }
        if (event) {
            this[event] = this[event] ? this[event] : {};
            this[event][id] = null;
            delete this[event][id];
            return;
        }
        let events = this[id];
        if (Array.isArray(events)) {
            for (let i = 0; i < events.length; i++) {
                this[events[i]][id] = null;
                delete this[events[i]][id];
            }
        }
        this[id] = [];
        delete this[id];
    }

    /**发送事件  
     * 参数个数不限,第一个参数为事件名,其余为传递给响应函数的参数  
     * @param {string} event 事件名    
     * @param args {}传递给响应函数的参数集,可以为空 
     */
    emit<T>(event, ...args) {
        let onwers = this[event];
        // console.log("trigger event:" + event);
        if (onwers) {
            for (let key in onwers) {
                let data = onwers[key];
                if (--data.times <= 0) {
                    delete onwers[key];
                }
                try {
                    if (!data.scope || !data.scope.node || !data.handler) continue;
                    data.handler.apply(data.scope, args);
                } catch (e) {
                    // console.error(e)
                }
            }
        } else {
            // console.log(event + "事件还没有添加事件监听!");
        }
    }
};
export default EventTool.Instance

http://www.kler.cn/a/500444.html

相关文章:

  • [创业之路-242]:《华为双向指挥系统》-1-组织再造-企业普遍采用的5种组织结构形式
  • Java 继承
  • 【AniGS】论文阅读
  • 大数据智能选课系统
  • Qt官方下载地址
  • Postman接口测试03|执行接口测试、全局变量和环境变量、接口关联、动态参数、断言
  • 负载均衡原理及算法
  • 是德科技M9010A PXIe 机箱+M9037A模块,台式应用的理想之选
  • iOS 解决两个tableView.嵌套滚动手势冲突
  • 《光学遥感图像中显著目标检测的多内容互补网络》2021-9
  • 深度学习-82-大语言模型LLM之基于langchain加载本地文档向量存储后检索
  • C# 告别FirstOrDefault
  • 轻松高效拿捏C语言02Hello World
  • zerotier已配置但ip连不上?
  • PHP多功能投票小程序源码
  • 代码随想录day26 | leetcode 134.加油站 135.分发糖果 860.柠檬水找零 406.根据身高重建队列
  • 基于java的餐厅点餐系统微信小程序ssm+论文源码调试讲解
  • Tomcat(133)Tomcat的SSL会话缓存故障排除
  • HTTP 范围Range请求
  • SQL分类与数据类型整理
  • Erlang语言的正则表达式
  • 自动化测试框架搭建-接口数据结构设计
  • NLP 基础理论和工具使用
  • C++实现设计模式---工厂方法模式 (Factory Method)
  • 科技快讯 | 抖音治理AI造假地震图片;投影仪也玩三折叠;京东发布“AI京医”大模型
  • XML 解析器:深入解析与高效应用