MatchVs与CocosCreater (2)

        上期我们讲到了matchVS在cocoscreater里面的使用和连接,并且简单介绍了一下回调在TS版本里面的使用方式。

这期,我想简单介绍一下sendEvent事件和帧同步的使用。

        进入游戏后,需要先通过调用getRoomDetail获取房间的详细信息,

    start () {
        global.Engine.getRoomDetail(global.roomID);
        global.Response.getRoomDetailResponse = this.getRoomDetailRes.bind(this);
    }

      获取房间信息的作用是为了获取房间里玩家信息,在该回调里面可以获取玩家列表和该房间的id号及是否可以watch等信息。

在matchVS中有两个重要的传递信息的方法,sendEvent和帧同步,分别来介绍一下他们的区别和使用方式:

1.sendEvent

   sendEvent是采用监听者模式单独发送事件来通知其他客户端的方式,对比与帧同步来说,我个人觉得同步性要求会更弱一点,适合于一些同步性不那么高的游戏中,如回合制的强链接游戏,棋牌游戏等。

   事件的回调形式如global.Response.sendEventNotify = this.sendEvtNot.bind(this);

   使用

   global.Response.sendEventNotify = this.sendEvtNot.bind(this);注册侦听

回调函数如下,通过判断事件的类型来区分具体是什么事件

sendEvtNot(eventInfo:MsSendEventNotify){

    if (eventInfo && eventInfo.cpProto) {

         let event = JSON.parse(eventInfo.cpProto);

         if (event.action === global.EVENT_PLAYER_POSINTON_CHANGED) {

         }

    }

而发送事件需要封装一下event事件

 let frameData = JSON.stringify({

             "userID": global.userId,

             "action": global.EVENT_PLAYER_POSINTON_CHANGED,

             "x": x

   });

 

    global.Engine.sendEvent(frameData);

    发送事件

    整个sendEvent过程和as的事件发送机制很类似,通过引擎发送,通过引擎接受

2.帧同步

   首先看一下帧同步白鹭大拿在论坛上发表的文章:

   https://bbs.egret.com/forum.php?mod=viewthread&tid=47833&ordertype=1

   其次有几点需要注意的是:

       1)我一开始研究帧同步的时候一直没有理解为何要在游戏初始化的时候去设置一下帧率,直接按照白鹭官方论坛的方式敲了一下代码,这才意识到,原来在游戏进房间后不设置帧率是无法获取帧同步事件回调的,自己发送

global.Response.sendFrameEventResponse = function(rsp){

       if(rsp.mStatus === 200){

       }

frameUpdate的回调完全收不到rsp.mStatus状态为200(成功)的状态,后来查了一下官网并参考了一下demo,才明白原来是帧率需要先设置一下。

这里补充一下设置帧率的状态码

200 成功
519 重复设置
500 帧率需被1000整除

let result = global.Engine.setFrameSync(20);

注意参数需要被1000整除,回调是:global.Response.setFrameSyncResponse

在matchVs中已经封装好了设置帧率的回调了。

       2)起初我不是很理解为何在DEMO里面会有两个回调,一个是frameUpdate的回调,另一个是sendFrameEventResponse,

    经过细致的学习,并通过查看官方API,我理解了,原来前者(frameUpdate)是获取全局帧事件的回调,而后者(sendFrameEventResponse)是针对自己发送的帧事件成功与否的回调。

    光从参数的上就可以理解其含义

         a)frameUpdate的回调

        frameUpdate(data:MsFrameData);

MsFrameData的构造函数里面有三个参数:

/**

* 同步帧数据类型

* @param {number} frameIndex 当前帧号

* @param {Array} frameItems 当前帧信息

* @param {number} frameWaitCount 等待的帧数量

*/

其中第二个frameItems就是event发来的数据信息了,通常会将其封装成一个json对象来解析,至

于帧号(frameIndex )该参数是标示当前帧号的参数,更新速度取决于帧率,

至于frameWairCount是同步帧内的数据包数组数量,它代表了在两帧之间的缓存数据信息,其长度就是data.frameItems.length

json {"name":"playerName","type":"type","index":1}

   b)sendFrameEventResponse回调:

   这个回调很简单,就是告诉客户端,当前的帧同步信息是否已经成功发出,如果回调接收的200,那代表发送成功。

总结:

1.sendEvent和帧同步都是客户端之间交互的方式,帧同步需要在调用回调之前设置帧率,以便客户端之间同步帧信息,每帧的信息都会在回调的data信息里面缓存,需要做好解析工作

2.在进入游戏的时候别忘记调用一下getRoomDetail,并绑定一下回调,这在判断其他回调事件时非常有用,如:谁发来的回调,谁可以发送某种类型的事件请求等。

3.帧同步有两种回调: frameUpdate回调,sendFrameEvent回调,两者的区别是前者是侦听全局的由matchVS发来的帧同步更新信息,后者是自己发送的事件是否被发送成功的回调

你可能感兴趣的:(socket)