云开发实时数据推送制作小游戏匹配玩家功能 您所在的位置:网站首页 小程序对战游戏 云开发实时数据推送制作小游戏匹配玩家功能

云开发实时数据推送制作小游戏匹配玩家功能

2024-05-24 12:43| 来源: 网络整理| 查看: 265

下面是功能介绍:

小程序·云开发新增实时数据推送能力,可以实时监听数据库中的数据变更。该功能有效地解决了即时通信以及实时更新和推送数据的问题,极大地降低在此类场景下的开发成本。

基于是实时数据推送能力,在给定查询条件的情况下,每当数据库更新而导致查询条件对应的查询结果发生变更时,小程序可收到一个更新事件,其中可获取更新内容和更新后的查询结果快照。

许多对战类型的小游戏需要一个匹配玩家界面,下面就从制作一个匹配玩家界面入手,简单介绍一下云开发实时数据推送功能。

1.首先打开微信开发者工具里云开发,在数据库中新建一个集合,集合名称:rooms,权限设置:所有用户可读,仅创建者可读写。

2.我们用一个两人对战的例子,来介绍如何实现匹配玩家。当玩家进入匹配状态有两个情况,一是当前已经有队列玩家只需进入队列即可,二是当前没有队列玩家要创建队列。这里定义一下创建队列的人叫做newMen,加入队列的人叫做addMen。如何判定当前是否有队列,下面用一段代码说明下:

const db = wx.cloud.database();const $ = db.command.aggregate;db.collection('rooms').aggregate().match({ people: $.eq(1)}).sort({ createTimestamp: -1}).limit(1).end().then(res =>{    console.log('聚合查询结果rooms',res.list);    this.initRoom(res.list);})

这里用的是聚合查询,对集合rooms进行查询,只要当前people字段值为1就说明已经队列,如果查询不到结果就是没有队列需要创建队列,下面就是initRoom()方法进行判断,代码如下:

initRoom(rooms){

       if (!rooms.length) {             this.createEmptyRoom();         } else {             console.log('进入队列成功');             this.nowPlayer = 'addMen';             this.docid = rooms[0]._id; 

            this.roomid = rooms[0].roomid;

            

           this.updatePeopleField();

         };

}

从上面代码可以看出,如果查询结果为空就要创建队列。不为空就进入队列,然后执行更新字段操作,后面会详细介绍。下面介绍创建队列createEmptyRoom()方法,代码如下:

createEmptyRoom(){                    const db = wx.cloud.database();                    const roomid = Date.now().toString();                    let room = {                        roomid,                        createTimestamp: Date.now().toString(),                        people: 1,                    };                    db.collection('rooms').add({ data: room })                    .then(res =>{                        this.nowPlayer = 'newMen';                        this.docid = res._id;                        this.roomid = roomid;                        this.waitJionGame();                    })    },

这里向集合rooms添加一个新记录,即创建队列,当前玩家即nowPlayer为newMen。创建队列完成后,我们要监听是否有玩家进入队列,就是有没有addMen进来。这里就要用到上面说的云开发实时数据推送功能了,相关代码如下:

waitJionGame(){        let docid = this.docid;        console.log('正在匹配对手...');        const db = wx.cloud.database();        this.player = db.collection('rooms')        .where({          _id: docid        })        .watch({          onChange: snapshot => {            const docChange = snapshot.docChanges[0];            const doc = snapshot.docs[0];            console.log('监听玩家进入', snapshot);            if (docChange.dataType === 'update' && doc.people === 2) {                console.log('匹配成功');                this.player.close();            }          },          onError: error => {              console.log(error);          }        })    },

通过对刚才创建的记录进行监听,只要dataType === 'update'即记录有更新操作,并且doc.people === 2,就说明有玩家进入即addMen进入队列,此时就可以关闭监听,执行close()。这时队列创建者即newMen,匹配阶段所有工作都完成了。对于加入队列者即addMen还有一个工作,告诉newMen我已经进入队列了,很简单就是把记录里的people字段更新为2。相关代码如下:

updatePeopleField() {

       let docid = this.docid;

        wx.cloud.callFunction({          name: 'updateDoc',          data: {            collection: 'rooms',            docid: docid,            people: 2,          }        }).then(res => {            console.log('更新人数成功',res);        }).catch(err => {            console.log(err);        })    },

更新队列创建者newMen创建的记录里的字段是一个越权操作,所以要调用云函数。通过云函数更新完成字段后,addMen所有使命都已经完成了。

这就是整个匹配玩家阶段的流程,相关效果可以参考本人开发的游戏--圣兵棋盘。

圣兵棋盘



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有