Cocos Creator+TS自己写一个消息机制

cocos creator+TS自己写一个消息分发机制

防止多个类之间过多耦合,后期维护困难。

消息分发基于侦察者设计模式,在需要进行处理消息的地方进行事件监听;派发消息时,调用消息中心的派发信息接口,遍历消息的监听队列,调用对应的回调方法。

事件管理者使用单例模式,全局调用。

class EventItem{
    name:string = null;
    callback:Function = null;
    target:any = null;
}

 EventItem是一个事件item类,用来进行分发消息的实例化,里面有事件名称,回调方法,监听对象。

事件有监听,分发消息,取消监听三个函数,其他有需要的可以自行进行扩充。

    //事件管理者唯一实例
    private static _instance:EventManager = null;

    //存放事件管理者监听的事件item
    private _eventList:Map<string,Array<EventItem>> = null;
    /**事件管理者的构造函数 */
    constructor(){
        this._eventList = new Map<string,Array<EventItem>>();
    }

    /**将事件管理者设置为单例模式 
     * @returns {EventManager} 返回事件监听唯一实例
    */
    public static getInstance():EventManager{
        if(!this._instance){
            this._instance = new EventManager();
        }
        return this._instance;
    }

    /**
     * 事件管理者的事件监听
     * @param eventName 事件名称
     * @param callback 监听执行的回调
     * @param target 监听对象
     */
    public on(eventName:string,callback:Function,target:any){
        let array:any = this._eventList.get(eventName);
        if(!array){
            array = new Array<EventItem>();
        }
        else{
            for (let i = 0; i < array.length; i++) {
                const element = array[i];
                if(element.callback === callback && element.target === target){
                    return;
                }
            }
        }
        const data = new EventItem();
        data.name = eventName;
        data.callback = callback;
        data.target = target;
        array.push(data);
        this._eventList.set(eventName,array);
        console.log(this._eventList);
    }

    /**
     * 事件管理者取消事件监听
     * @param eventName 事件名称
     * @param callback 
     * @param target 
     */
    public off(eventName:string,callback:Function,target:any){
        let array:any = this._eventList.get(eventName);
        if(!array){
            return;
        }
        else{
            for (let i = array.length - 1; i >= 0; i--) {
                const element = array[i];
                if(element.callback === callback && element.target === target){
                    array.splice(i,1);
                }
            }
        }
    }

    /**
     * 事件管理者的发送消息
     * @param eventName 事件名称
     * @param argArray 发送数据时带的数据
     */
    public emit(eventName:string,...data: any){
        let array:any = this._eventList.get(eventName);
        if(!array){
            return;
        }
        else{
            for (let i = array.length - 1; i >= 0; i--) {
                const element = array[i];
                if(element.callback && element.target){
                    element.callback.apply(element.target,[data]);
                }
            }
        }
    }

发送消息的时候,可以带参数,如果有多个参数,我这边是放到数组中进行处理,在执行回调的时候,需要注意以下。

以上是通过查看B站某位U主的视频,总结写出来的,如果有侵权的地方,请联系我。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
CocosCreator是一种基于 TypeScript游戏开发引擎,而protobuf是一种数据序列化格式。要在CocosCreator中使用protobuf实现登录功能,首先需要进行以下几个步骤: 1. 下载protobuf库:在项目的assets目录中创建一个新的文件夹,例如"protobuf",然后从protobuf官方网站上下载protobuf的JavaScript库文件,并将其解压到该文件夹中。 2. 创建.proto文件:在项目的assets目录中创建一个新的文件,例如"login.proto",并在其中定义登录功能所需的消息结构。例如,可以定义一个"LoginRequest"消息,包含用户名和密码字段,并定义一个"LoginResponse"消息,表示登录结果。 3. 生成JavaScript代码:打开终端,进入到protobuf库所在的文件夹,执行以下命令来生成JavaScript代码文件: protoc --js_out=import_style=commonjs,binary:生成代码路径 -I=proto文件所在路径 proto文件 这将根据.proto文件生成对应的JavaScript代码文件,用于在CocosCreator中进行序列化和反序列化。 4. 在CocosCreator中使用protobuf:将生成的JavaScript代码文件拷贝到CocosCreator项目的assets目录中,然后在适当的地方引入protobuf库。 5. 编登录功能代码:在需要实现登录功能的脚本文件中,使用引入的protobuf库来序列化登录请求数据,并将其发送到服务器,并处理服务器返回的响应数据。 总的来说,使用CocosCreator和protobuf实现登录功能需要先创建.proto文件,然后通过protobuf库生成对应的JavaScript代码文件,并将其引入项目中,在代码中使用protobuf库进行消息的序列化和反序列化,以实现与服务器的通信。这样就可以在CocosCreator中使用protobuf来实现登录功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡西莫多说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值