用户:云业余查看:297 回复:220 评论:297 创建时间:2019-06-07T23:34:52
大家好,我是云业余,是一位接触编程猫差不多半年的萌新。秉着“共同进步,一起学习”的原则,我会以前缀【业余课程】为标题教给大家一些做游戏的小知识和小技巧。方便大家需要的时候搜索。
今天第一堂课,教给大家联机的最基本原理!
联机游戏,是编程猫里最多人想做却不知道如何下手的东西,都觉得联机很难,其实如果去掉其他复杂的东西,联机的核心机制反而是最最简单的!
一、误区
最初我和大多数人一样,都认为联机是大佬才会的东西,是很复杂的,其实不然。按照一开始的想法,联机游戏应该是有很多人同时在匹配,然后随机两两配对,也就是同一个游戏有很多人同时在联机玩。后来发现这其实是错的!
其实联机游戏,就是按照点击匹配按钮的先后,决定最先点击的两个人进入对战。
二、联机的核心机制
在做完《契灵者》后,我才开始思考联机游戏,买了《战棋》看了源码,对于萌新的我,还是不懂。去社区搜索联机教程,发现也是寥寥无几。然后终于有一天,我想明白了。
今天我教大家的是抛开其它复杂的排队,检测离线,如何在两个玩家间产生联动等等东西,这些咱们先不想,咱们就先思考如何匹配!
联机游戏的核心是云变量,有了云变量,才能实现联机,而实现匹配跳转,只需要两个云变量。
三、如何匹配
1、添加云变量模块(如果连如何添加云变量都不会的话,请不用看这个教程了哈),新建一个云变量命名为“玩家编号”,另一个命名为“房间”。
2.添加一个匹配按钮,在按钮上拼积木。
接下来解释一下这段积木的意思。
当开始匹配按钮被点击的时候,让云变量“玩家编码”增加1,云变量“房间”增加1,普通变量玩家等于此时的云变量“玩家编码”。
问:为什么要让云变量加1呢?
第一个云变量“玩家编码”,是为了在联机中区分谁是玩家1,谁是玩家2,不同的玩家看到的画面当然都是相对的,这个暂时不说,今天单说匹配。
想象一下,老师手里拿着一副按从小到大顺序放好的数字扑克牌。老师要你们一个一个上来领一张扑克牌。第一个拿到扑克牌的人,手里的扑克牌就是1,轮到第二个人的时候,他拿到的扑克牌自然就是2了,第三个人拿到的,当然就是3的扑克牌了,以此类推。
然后老师说,拿到扑克1和扑克2的人,上台来打架……(当然是不可能的!)然后对战就开始了。
同理,如果云变量“玩家编码”的初始值是0,点击一下,云变量变成1了,然后用一个普通变量去等于此刻云变量的值,那么你的号码牌已经确定了,你就是编号为1 的玩家。如果这时候有第二个人点击,云编号是不是又增加1了?那么此时云变量等于2,第二个人也用普通变量等值于此刻的云变量,那么第二个玩家的编号就等于2了。
这个时候玩家的编号就确定了,第一个点击的是玩家1,第二个点击的是玩家2.
既然已经凑齐人了,是不是该开打了?如何判断人够了?这就是云变量“房间”的作用!
每点击一次,房间云变量增加1,所以有两个人点击匹配,房间的值就变成2了。也就是说,现在有两个人了,可以开撸了。所以后面的“如果”语句,就是判断是否该跳转对战了。
于是,可以开始联机了。
问:如果我拼命点击,岂不是自己和自己打了?
理论上是这样,但为了防止同一个玩家没事做,自己点两次匹配,一般都会加一个匹配中的造型,然后来点动画效果,加个积木重复执行直到房间人数等于2。这样的话,按钮程序会在动画效果里循环,同一个玩家点击便不会有变量的改变了。
问:如果有人在对战了,其他人也点击了怎么办?
当然,刚才给大家的代码是不齐全的。可以增加一个当点击时,如果房间人数小于2,正常匹配,否则新建对话“有人在对战了”或者干脆没反应,自由发挥。
问:联机真的这么简单么?
联机当然没有那么简单,要考虑的东西很多。比如有人觉得不好玩喀拉一声就直接关掉网页或者界面怎么办?房间岂不是一直被霸占着?比如怎么样让玩家1看到的和玩家2看到的画面是相对的,很多东西都要考虑,还需要用到很多的云变量去同步两个玩家的状态。
所以建议大家如果要做联机游戏,一开始做些简单的。比如联机石头剪刀布,联机掷骰子之类的,只需要一两个云变量就能同步的游戏。
最后说一句,光看教程没有用,只有正真动手做才能真正进步和学会知识。
贴上我的联机游戏《吃鸡战场:粒子战衣》给大家体验一下。以后会开源的。https://shequ.codemao.cn/work/30193091?entry=copy_work_url