1项目概况游戏开发,尤其是微信小游戏开发,是近几年的热门话题。本次“云开发”公开课将带领大家一步步通过实战“在线五子棋”,在不使用后台的情况下,使用“小程序?云开发”独立完成一款微信小游戏的开发与开发。在线的。2任务目标根据项目最初的框架,在阅读教程的同时,逐步完成画板、音乐播放、玩家对战、输赢判定等功能,最终实现一个可以愉快玩的在线五子棋游戏。在此过程中,您将了解Serverless的一些概念并在实践中应用,例如:云数据库、云存储、云函数和增值能力。除了这些基本功能外,还准备了更多硬核概念和实现实践,例如:实时数据库、聚合搜索、权限控制等。开发完成后上传并设置为试用版,欢迎邀请更多人体验。3准备工作从TencentCloudBase/tcb-game-gomoku下载代码到本地:gitclonehttps://github.com/TencentCloudBase/tcb-game-gomoku.gitcdtcb-game-gomoku/切换minigame-study分支专用于课程:gitcheckoutminigame-study4实践任务4.1搭建云开发和小游戏环境1、打开微信IDE,点击左侧小游戏,选择右侧导入项,导入之前下载的“OnlineBackgammon”目录,并修改AppID为您已经注册的小游戏的AppID。2、进入后,点击上方的云开发按钮。如果之前没有开通云开发,需要开通云开发,新开通需要等待10到20分钟。3、进入“云开发/数据库”,新建一个集合,新集合的名称为rooms。4.进入“云开发/存储”,点击“上传文件”。上传的内容是/static/下的bgm.mp3和fall.mp3。在下面的代码中,将通过云存储接口请求文件的临时url。这样做的目的是减少用户第一次进入游戏时加载的静态资源。4.2准备配置文件创建配置文件:cpminiprogram/shared/config.example.jsminiprogram/shared/config.js将关键字段信息替换成自己的账号信息:4.3创建云开发接口打开miniprogram/shared/cloud.js,初始化云开发能力,暴露云数据库和聚合搜索API。4.4获取云存储资源链接为了减少用户首屏加载的静态资源,音乐资源不放在小程序目录下,而是放在云存储中,通过调用返回临时静态资源云存储链接的api接口。在miniprogram/modules/music.js中会调用资源接口获取资源链接:getTempFileURL函数与云开发相关,所以放在miniprogram/shared/cloud.js中。这里只需要临时链接tempFileURL属性,其他返回值直接过滤调整即可。为了方便外部调用,promise不再使用reject来抛出错误。对于错误异常,返回一个空字符串。这样加载失败的资源不会影响正常资源的加载和Promise.all中的逻辑。4.5游戏进入和身份判断根据前面的流程图,我们可以看出游戏玩家的身份分为所有者和玩家。其含义如下:owner:玩家进入游戏后,检查是否有空闲房间,如果没有空闲房间,则主动创建新的空闲房间。那么对于新建的房间,玩家就是主人。玩家:玩家进入游戏后,查看是否有空闲房间,如果有空闲房间,则加入空闲房间。那么对于空闲房间,玩家就是玩家。判断依据是在judgeIdentity方法中读取云数据库集合中的房间记录。如果有多个空闲房间,需要选择创建时间最晚的房间。所以,这里就需要“聚合搜索”的逻辑。这里聚合查找的条件有3个:标记人数的字段,是否为1,创建时间倒序只选1。没有空闲房间,玩家需要自己成为主人创建新房间,等待其他玩家加入。创建房间的逻辑是将约定的字段放入云端数据库的记录中。这些字段是:roomid:6位房间号,唯一nextcolor<"white"|"black">:下一步是白/黑棋子:编码棋盘数据createTimestamp:记录创建时间戳,精确到mspeople:房间人数是的,你可能已经注意到了这里需要保证roomid不重复。因此,本地生成的随机roomid需要调用云端数据库的查询接口,查看是否存在。如果存在,则递归调用它以重新生成随机字符串。4.7监控玩家进入对于拥有者身份,除了创建新房间外,还需要监控玩家身份创建后进入游戏的玩家。玩家身份的玩家进入游戏后,会更新记录中的people字段(1=>2)。这时候就需要使用“实时数据库”功能来监控远程记录的人员字段的变化。代码实现中,调用watch方法,传递onChange函数参数。一旦有什么问题,可以在onChange回调函数中获取。对于传递给回调函数的参数,有两个重要的参数:docChanges:数组中的每一项对应每条记录的变化类型,变化类型包括init、update、delete等。docs:数组中的每一项对应每条记录的当前数据。4.8未授权更新字段对于玩家身份,进入房间后,既不需要“创建新房间”,也不需要“监控玩家进入”。但是记录的人员字段需要更新。由于记录是由所有者玩家创建的,云数据库只有以下4个权限:所有用户可以读取,只有创建者可以读写只有创建者可以读写,所有用户可以读取,所有用户不能读写写入以上4个权限,并没有“所有用户可读写”。所以,遇到越权读写的情况,需要通过调用云函数,以“管理员”权限来实现。在cloudfunction中创建updateDoc云函数,用于接收前端传来的collection、docid、data字段。对于数据字段,它是数据记录的最新更新的数据。在小游戏中,通过wx.cloud.callFunction调用云函数。传入的data字段表示要调用的云函数,传入的data字段可以在云函数的回调函数的事件参数中访问(如上图所示)。4.9定位更新逻辑不管是玩家身份还是主人身份,都需要处理战利品的逻辑。在走法逻辑中,以下两种情况为无效走法:点击位置已经有棋子,对方没有下法,还在等待。对于以上两种情况,处理逻辑是:棋盘的状态保存在内部类中,调用走棋的函数会返回走棋成功与否的字段标识。只有监听到远程棋盘的更新后,才会打开本地锁,允许走棋;移动后,它将再次被锁定。如果你赢了,你需要调用退出逻辑。但无论中奖与否,都必须将本地最新状态更新到云端。4.10监控远程板的更新无论是玩家还是拥有所有者身份的玩家,都需要监控远程板的更新逻辑。当远程棋盘字段更新时,本地根据最新的棋盘状态重新绘制整个棋盘。并进行输赢判断,如果可以判断输赢,则退出游戏;否则,打开本地锁,玩家就可以玩了。因为需要监控不同的身份,所以这块的监控逻辑可以复用。不同的是,两个身份的监听开始时间不同。所有者身份需要等待玩家身份玩家进入游戏后才开始看板监控;playeridentity是为了更新people字段后开启看板监控。在监控逻辑中,需要判断远程更新的字段是否为棋子,通过前述的dataType实现。还需要判断记录中的nextcolor字段是否与本地颜色相同,来决定是否打开本地锁。如果满足以上两个条件,则执行更新本地棋盘、判断输赢、解锁本地锁的逻辑。4.11游戏结束和退出每次需要判断输赢,如果能判断出输赢,则进入游戏退出逻辑。退出逻辑分为两部分,第一部分是提示用户,第二部分是调用云函数清除记录。第一种逻辑提示用户判断用户的胜负状态:第二种逻辑中清空记录是为了方便调试。对于真实的业务场景,一般不会删除历史数据,方便问题定位。同时,这也是一种越权操作,需要调用云函数来实现。6.课程完整源码https://github.com/TencentCloudBase/tcb-game-gomoku7.联系我们了解更多云开发技巧和Serverless行业动态,扫描二维码关注我们~