用户:
I桔汁糖浆I查看:29 回复:52 评论:29 创建时间:2018-07-02T23:15:26
yoooo大家好我是上海,在萌新院是一个打杂的。
几个月前我曾经研发出了一个双人联机排队系统,本想能够创造编程猫的一个新喵,结果感觉好多人都看不懂、不会用的样子……
那么,我就深入浅出地解析一下我的联机模块的原理吧。
国际惯例,先把模块的变量和积木图片发上来(前方长图):
在变量图片中,画红框的是模块中较为重要的部分。
而积木所在的角色有四个造型,分别写着“排队中”、“匹配中”、“匹配成功”、“由于您切出了游戏导致您的位置被他人占据。将在四秒后重新排队”这四段字。每个造型分别对应着一种联机状态。其实还有第五种,即“对方离线”,只不过是其他角色和积木所掌管的事情了,本贴只说一种处理方法,即重启游戏。是的,重启游戏emmm
如果你看不请,请右键图片——在新标签页中查看,然后合理使用页面缩放功能。
那么,我们开始分析一坨中每一项每一项的作用吧!
进入队列
各位如果有经常玩我的“精灵Battle”,就可能遇到一个提示:您前面还有xx人。那么要做到这个,首先需要建立一个名为“云排队编码”的云变量和“排队编码”、“排队末尾判定”这两个本地全局变量。当模块被触发时,我们先把“云排队编码”的值赋给“排队编码”,这个就是我们当前的队列序号。然后另“云排队编码”的值+1,这个就是下一个参与排队的人的序号。注意了!这边用到了一个高端操作——“告诉(自己)执行……”。这个操作往往可以把几个模块整合在一块,乃居家旅行之神技也。那么在这个模块中,我们做了一件事情:一直判断“云排队编码”的值是不是之前我们赋予的值,如果不是,就说明喵后面有人进入队列了,我们不是队列的最后一个人,此时设置“排队末尾判定”的值为1。这个变量在之后才会用到,现在我们不管他。
人数判断
在这个地方,我们判断了一次在线人数是否小于等于3,如果是,则让“云排队编码”的值变为0,为第三个人的队列序号做准备,并且跳出的大循环,直接进入匹配状态。要提一点的是,在本模块中,队列中第一个人的序号为0。
游戏结束判断
为什么要做队列?就是为了能让玩家等待游戏结束后直接“新开房间进行游戏”啊!这个时候就免不了我们判断游戏是否结束。在这个部分,我们需要用到计时器。我们首先把计时器清零,然后发布一个公告:当前你前面还有多少人。这个公告贮存在一个名为“排队人数提示”的本地全局变量上,调整好变量的位置,到时候显示即可。公告部分和计时器归零积木可以互相调换位置。
接下来就是本模块的一个关键点。在讲解之前,我们要引入一个概念——“黑房间”。你可以想象一个画面:在一个黑不溜秋的房间里,你看不见任何东西。而你想要知道房间里是否还有人,就只能喊一句“有人就吱一声”,然后等待“吱”的声音。如果真的听见的话,那么当然证明有人了;没有听见的话,有两种情况:一种是这个房间里除了你之外就没人了,另一种是对方的反射弧绕地球七圈,反应比较慢(网络延时),需要一段时间才能作出回应,这时候你要做的就是继续等待。当然,等待也有一个限度,如果超过了限定的时间,就直接认为这个房间里没人了(游戏结束),然后开始下一步行动。在这个部分的重复执行里,我们首先要同时进行两个判断:一个是名为“匹配连接数据”的本地全局变量是否等于名为“云匹配用数据”的变量,另一个是判断计时器的值是否大于3秒。前一个判断中,“云匹配用数据”的值会因为下面的一些积木而不断变化,这个时候我们只要判断是否变化,如果有就说明游戏还在继续。而当计时器大于三秒时,除去网络真的卡得嫑嫑的,就说明游戏结束了。那么,我们就可以跳出这个小循环,进行接下来的步骤。
向前进!
到了这一步,恭喜您,你终于可以跟随着队列前进了。我们首先要把“云匹配用数据”的值设为0,避免与下面的一些模块相冲突。然后我们进入了一个新的循环。进入的第一步就是判断自己的队列序号是否等于0或者“云匹配用数据”是否等于2。如果序号为零,进行判断“云匹配用数据”是否小于2。如果依然成立,恭喜你,进入了匹配状态。在此之前,我要告诉大家在本模块中,“云匹配用数据”的值为0和1时,模块处于匹配状态;2和3时,代表联机成功,游戏开始。而第二个判据就是判断游戏是否开始,如果开始的话,重新回到人数判断和游戏结束判断两个阶段。
如果都为否,那么计时器归零,判断一下人数(因为排你前面的人可能退出了游戏,此时的人数小于等于2)和等待计时器的值为3秒。如果小于二人,则跳出循环,与人数判断相辅相成,进入匹配状态。而计时器为3秒时,先判断自己是不是在队列末尾(即“排队末尾判定”的值为0),如果是,则把“云排队编码”的值-1,告诉即将来到喵后面的人队伍变短了,然后更新公告。就这样不停地向前进,当自己的序号为0时,就代表前面没人,进入了匹配状态。
匹配初始化
New Stage!前面我们已经把“云匹配用数据”清零了,这边就不会出现bug了应该。我们首先要判断一下“云匹配用数据”的值,然后在0和1之间做出抉择,把“匹配连接数据”的值设置为不等于“云匹配用数据”的值,然后把“云匹配用数据”的值设置为“匹配连接数据”的值。很绕口对不对?看积木啊!而且这样做,是为了下面的积木发挥作用。
隐藏掉公告变量,切换造型,设置名为“游戏数据传输”的云变量的值为0,为接下来的事情做准备。
连接?连接!
恭喜你熬到了最后一步!进入该步骤的第一件事就是判断“云匹配用数据”的值是否等于“匹配连接数据”的值。这个步骤和上面的游戏结束判断中的一个部分是一样的。也就是说,如果变量变了,就说明有人和你一起进入了匹配状态。此时进行下一步骤。
为什么要判断一下“游戏数据传输”的值是否等于0或者connected呢?因为有些人耐不住性子,在匹配阶段把游戏给切出去,搞其他东西去了。而游戏切出去时就会暂停运行,直到被切回来。此时可能有别人占据了它的位置,开始游戏。而如果不做处理的话,就会有两个人控制同一个角色的情况发生。这是我们要处理的。我们可以看到,在这个部分中,我们让“游戏数据传输”的值最终变为ready,从而让切出游戏后再切回来的人的客户端的判断不通过,然后重新本模块……
现在,我们已经让两个客户端进行了连接。你现在可以用云变量令两个客户端的游戏数据互相传输,且不用担心有第三方插入了。并且我们会不停地把“云匹配用数据”的值在3和4之间切换。当一方离线,该云变量就会停止变动。此时利用计时器判断停止变动的时间是否超过两秒。如果超过了,即说明对方离线。发送“对方离线”的广播后,这个模块完成了他的使命。
END
技术贴没人看的,真的不会有人看的