cocos creator 3.x使用官方帧同步服务开发实时对战微信小游戏教程(二)

继上一篇文章cocos creator 3.x使用官方帧同步服务开发实时对战微信小游戏教程(一)我们已经成功申请了一个2V2的matchId,接下来我们将在cocos creator 3.x开发的游戏中使用它。(开发的时候建议创建1V1的matchId,方便调试)

本章内容:

玩家点击匹配按钮,调用自己的后端服务器,获得步骤1生成的matchId,使用这个matchId调用小游戏服务

以单场景为例,放一个button按钮,文本设置为“开始匹配”,点击按钮后调用自己的后端服务器获取matchId并调用游戏服务等待其他玩家,同时显示一个窗体告诉玩家正在匹配。

public gameserver:GameServer| null = null;
start() {
    
    
	//实例化游戏服务并登录
	this.gameserver = new GameServer()
	this.gameserver.login()
}

这个GameServer类,我用的是官方例子中的GameServer.js,里面封装好了大部分方法如登录、匹配、以及检查微信版本号等,把它转换成ts引入即可。

进入场景后先实例化一个游戏服务对象并登录,需要注意的是login需要1-2秒左右的时间才能登录成功,如果用户在login未登录成功之前就点击了匹配按钮调用匹配服务是会报错的,开发者可以自己加逻辑比如登录成功后才enable匹配按钮。

添加匹配按钮的事件

 onbtnMatchClick() {
    
    
 	 let _this = this
     let request = {
    
     userId: "test", vsType: "2V2"}
     //post方法调用自己后端服务器获取matchId,自己封装哈不会的可以百度XMLHttpRequest
        post("GetMatchIdByVsType", request, function (result) {
    
    
        //result就是服务器返回的matchId
            if (result != "") {
    
    
                _this.gameserver.server.startMatch({
    
    
                    matchId: result,
                    success: () => {
    
    
                        console.log('加入匹配成功')
                        //_this.lblMessage.string = '匹配中...'
                    },
                    fail: res => {
    
    
                        console.error('加入匹配失败', res)
                        //_this.lblMessage.string = '匹配异常,请重启游戏'
                    }
                })
            }
            else {
    
    
                //_this.lblMessage.string = '获取匹配Id异常'
                return;
            }
        })   
 }

使用post方法获取到matchId后,即可调用GameServerManager.startMatch开始匹配。

在一开始new GameServer()的时候,this.bindEvents()方法会绑定许多事件,其中包含了监听匹配事件onMatch,也就是说当2V2模式下4位玩家都用相同的matchId匹配时,便会进入onMatch所绑定的事件。
我们看看官方例子中的onMatch方法中都干了些啥

onMatch(res){
    
    
        let nickname = res.groupInfoList[0].memberInfoList[0].nickName;
        databus.currAccessInfo = this.accessInfo = res.roomServiceAccessInfo || "";
        this.joinRoom(databus.currAccessInfo)
            .then((res) => {
    
    
                let data = res.data || {
    
    };
                databus.selfClientId = data.clientId;

                this.updateReadyStatus(true);

                if (databus.userInfo.nickName !== nickname) {
    
    
                    setTimeout(
                        this.server.broadcastInRoom.bind(this, {
    
    
                            msg: "START",
                        }),
                        3000
                    );
                }

                wx.showToast({
    
    
                    title: "匹配成功!3秒后开始游戏",
                    icon: "none",
                    duration: 2000,
                });
            })
            .catch((e) => {
    
    
                console.log(e);
            });
    }

databus在官方的例子中是一个用来保存匹配信息的类,我们可以放到项目里使用。该方法中用到databus的地方有两个:currAccessInfo和selfClientId,currAccessInfo是加入房间用的参数,说白了就是一个string类型的tokenselfClientId表示自己在房间中的标识,比如1是你自己,2就是对面玩家,如果是2V2匹配模式还会有3和4,我们可以用这个ClientId来设置玩家的出生点,比如地图上有ABCD四个点分别对应1234,那么开始游戏后四名玩家将会按顺序分配到不同的出生点。玩家的selfClientId是根据进入房间顺序决定的,并不一定是1

在cocos creator中,我们可以在onMatch方法中加入eventTarget.emit来发射事件,比如加入eventTarget.emit(‘matched’, ‘匹配成功,即将开始’) 然后在场景的start()里eventTarget.on(‘matched’,function(){//弹出提示告诉玩家匹配成功了,游戏马上开始}),不了解的话可参考cocos creator 发射和监听事件

当房间内的所有玩家都进入了onMatch方法,3秒后便会触发onGameStart事件,需要注意的是,如果四位玩家都匹配成功,但是在读秒的3秒内有一个玩家关闭了小游戏,那么所有玩家便不会触发onGameStart事件(如果匹配规则开始百分比设置100的话,这边不是很确定如果设置75会不会触发,有兴趣的玩家可以自行尝试)。如果遇到这种情况,官方的例子里是没有解决方案的,其他玩家会卡在onMatch并且不会重新匹配。我自己的做法是在onMatch里开启定时器,如果8秒内没有调用onGameStart就调用leaveRoom,弹出提示说有人开溜了,让玩家重新匹配。

扫描二维码关注公众号,回复: 15565136 查看本文章

如果四名玩家都很乖没有人开溜,那么便会顺利进入onGameStart()方法,官方例子中在这个方法里记录了一些调试信息,我们实际使用的时候只需要用cocos creator的发射事件eventTarget.emit(‘battle’) 通知场景可以开始游戏就行了,场景的start里注册eventTarget.on(‘battle’,function(){//游戏正式开始了,跳转至战斗场景})

这个时候如果不出意外,客户端就已经在不停的接收游戏服务下发的帧了,33ms一次,匹配功能也基本完成了。

接下来一章将展示如何处理游戏帧以及注意事项。(啊好困,过几天再写吧…)

简单的线上样例:
微信小游戏《精英坦克手》1V1匹配

猜你喜欢

转载自blog.csdn.net/hangsky1990/article/details/131343156