Egret社区

socket如何实现跨场景监听

2019-8-16 11:20
5564
1银子
本帖最后由 特污兔 于 2019-8-16 11:27 编辑

新入坑人员。也加了几个交流群。大佬脾气不太好。
也看过官网。但是都是谁发送谁监听。不满足需求
也实现了简单方案,全局单例模式。不够优雅

需求:
1 . socket在main.ts实例化后,一旦接受到服务器推送消息, socket只做一件事。socket.dispatchEvent("message")派发事件,将数据传出去。
2 .假设我有十个游戏场景(可能是不同类),其中八个场景需要与服务器通信。在这八个需要通信的场景中,只需要this.addEventListner("message",callback,this)即可。
3.综上其实就是发布订阅模式。无奈尝试很多方案都没有实现。希望论坛有大佬解惑

这里有个及其简单的代码

//socket.ts文件
namespace egret {
    //socket 事件类
    export class SocketEvent extends egret.Event{
        public static readonly CONNECT: string = "SOCKET_CONNECT"
        public data:any
        public constructor(eventName:string,data:any){
            super(eventName,false,false)
            this.data=data
        }
    }
    //socket 实现类
    export class Socket extends eui.Component {
        private event:SocketEvent = new SocketEvent(SocketEvent.CONNECT,"xyz")
        public constructor(){
            super()
            egret.setTimeout(()=>{
                //2秒后派发事件
                this.dispatchEvent(this.event)
            },this,2000)
        }
    }
}


//在 main.ts中
let socket = new egret.Socket()
this.addEventListener(egret.SocketEvent.CONNECT,e=>{
   console.error(e.data)
},this)

目前这样没有反应
如果将main.ts中的this.addEventListerner换成socket.addEventListener是可以拿到数据的
main.ts这里只是测试。可能在  class XXX class YYYY 中都要实现this.addEventListener(egret.SocketEvent.CONNECT)Socket类继承自event.EventDispatcher也是跟目前代码一样的结果

求解惑。或者说egret中不可能实现呢。该方式灵感来自于egret内置的add_to_stage事件。在任何场景都可以监听到此事件


分享到 :
0 人收藏

4 个回复

倒序浏览
ove  登堂入室 | 2019-8-16 11:25:11
单例怎么就不优雅了呢。。。
dujunfeng  圆转纯熟 | 2019-8-16 11:37:19
楼主可以写一个eventbus类当介质,可以在任意场景addevent,然后在需要场景fireevent
特污兔  初学乍练 | 2019-8-16 12:02:24
ove 发表于 2019-8-16 11:25
单例怎么就不优雅了呢。。。

感觉没有我预期的这种方式优雅
23331122  登堂入室 | 2019-8-19 17:42:28
创建一个公开的类 Class,然后再公开一个 socket
public ss:egret.Socket;
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

特污兔

初学乍练

积分: 6 帖子: 4 精华: 0

楼主热帖

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部