3-1 制作联机功能
终于!经过前两课的制作 我们成功的做出来了一个很像样的贪吃蛇大作战游戏:
不过 你会不会感觉有些许单调?那么这个时候就要请出我们的 MMO! 没错!我们终于要进入制作MMO的阶段了~ 我们在开始施工之前先预览一遍整体原理图!
贪吃蛇大作战MMO实现原理图
这就是贪吃蛇MMO实现的大致原理了~,乍一看是不是有点复杂? 但其实只要把逻辑梳理清楚MMO的实现就非常简单了! 那么接下来我们就按照这个原理去实现贪吃蛇的MMO多人联机功能!
第一步 - 连接MMO服务器
首先肯定是添加MMO扩展啦。 我们前往扩展库找到MMO扩展点击添加~
然后我们回到贪吃蛇的角色:
我们从MMO扩展中拖出连接MMO服务器并等待连接成功的积木, 随后我们将服务器ID改为 无尽模式 将房间类型改为 游戏室:
然后我们可以勾选一下显示当前房间的玩家数量积木:
然后我们进入游戏看一下:
好!我们可以发现当前房间的玩家数成功的从0变成了1,这也就代表我们成功的连接到了MMO服务器。 然后我们现在要做的就是将自己的数据打包然后丢到MMO的服务器里面。
第二步 同步数据
首先我们创建一个新的列表叫做 贪吃蛇身体数据:
在刚进入游戏时对列表进行一次重置:
然后我们将 在 贪吃蛇身体数据 的第1项前插入 XX 的积木拖出来~ 并且放到身体刚被克隆的时候:
接下来让我们写一段创建贪吃蛇坐标数据的代码。 (四舍五入(X坐标)) (四舍五入(Y坐标)) 然后通过 | 将两个字符串连接到一起 四舍五入是为了防止坐标信息精度过于高位数过长影响性能:
然后我们将拼接好的积木放进插入的内容里面:
随后让我们来运行一下看看效果!
很好,列表成功的出现了坐标数据,但是这个数据会一直增长 而不是按照身体数量。 这个问题只需要我们在克隆体被删除的时候同步删一下列表项就可以了~。 那么首先我们先回到克隆体的脚本这里, 然后我们将 删除 贪吃蛇身体数据 的第XX项 拖出来并且放到当克隆体要被删除的时候:
如果我们要把克隆体删掉了那就代表他现在处于贪吃蛇的末尾,那么我们只需要删掉贪吃蛇的末尾项就可以了。
直接删除列表的第 总项目数 项 是不是就行了:
不过这只是其中的一种方法,我来教你们一种更快捷的方法:
我们直接在第几项中填写" last " 也就是最后的意思 那么这个时候奇迹就发生了:
他一样成功的删除了! 不过话说回来 列表不是只让输入数字吗?输入其他的字不是会被直接反弹回去吗。 那么这个时候就要用到一个神奇的小技巧了, 首先我们打出last 随后我们点一下旁边 退出编辑模式:
诶我们会发现他又变回 1 了:
不过不要慌张!这个时候我们按一下 Ctrl+Z 给他撤回一下,右键选择撤销也是可以的:
啪的一下,神奇的事情就发生了 我们可以看到他成功的变回了刚才输入的last并且不会变回1
相信各位现在的神情应该是:
hhh 我当初刚知道这个小技巧的时候也这样~ 好了~ 让我们回归正题! 现在我们解决了贪吃蛇的身体数据问题那么是不是就应该同步给MMO服务器了, 那么首先我们从MMO中拖出 当我进入房间时:
然后我们要判断一下接收到的是不是本体,要不然该执行重复了:
然后我们就要将身体数据上传到MMO了,我们先创建一个新的列表叫做 MMO额外数据:
然后我们做一下初始化:
当绿旗被点击先清空列表 然后将任意一个值加入列表。 然后我们回到当进入MMO房间这里,拖一个循环进去 用来循环更新自己的贪吃蛇数据:
然后我们重复执行将额外数据的第一项设为贪吃蛇身体数据:
接着我们就要来写上传了!,不过在此之前我们先添加一个新的扩展:
大名鼎鼎的 Ccwdata (Gandi数据助手)。 然后我们将MMO中的设置数据的积木拖出来,拖出之后我们将要设置的项选择额外数据:
接下来就要用到我们的data扩展了:
我们使用data中自带的 转换XX列表成JSON 的积木 然后将额外数据设为转换后的json。 然后我们顺带的把其他的数据也设置一下,把 xy坐标 方向 以及大小也都上传上去,然后我们还要同步一下加速模式更改的颜色:
我们在初始化列表这里将添加XX到列表的积木复制一份:
然后回到MMO数据同步这里,复制一份替换XX项积木 并将内容改为获取特效颜色的值:
然后我们将修改项修改为2:
这样我们的数据上传部分就搞定了,接下来就是克隆出其他的贪吃蛇。
第三步 - 显示其他玩家
我们新建一个函数叫做 初始化其他玩家 并开启运行时屏幕不刷新:
然后我们创建一个新的变量交错 初始化MMO克隆 并将变量设为仅适用于当前角色(私有变量):
刚开始的时候先将变量设为零,然后我们重复执行一个当前房间的玩家数的次数。
每次循环将变量增加1,也就是充当一个循环次数的作用:
然后我们来判断一下这次循环要克隆的人是不是自己,如果不是自己那么就将他克隆出来:
然后我们使用多莉中的克隆XX角色并设置XX键为XX,克隆一个自己并且将名为data的键设为当前遍历到的ID 不过这里为了方便我们判断他是其他玩家的主体 我们可以给他加上一个特殊的标识符:
在标点符号里面找到一个你喜欢的来当做标识符就可以~ 我这里用的是 ©:
就像这样把标识符和id连在一起即可。 然后我们将原来的普通克隆也换一下:
这里我们可以将data直接设为一个用来标识这是自己克隆体的符号或者是单词就可以了:
我这里就直接将data设为own(自己)就可以了:
好了,处理完初始化和自己那么肯定就要来写对应的克隆体代码了。 我们先回到克隆体运行代码的这个地方:
我们先回到克隆体运行代码的这个地方, 首先来判断一下是否是自己,如果是自己那么再执行之前写的自己的代码:
我们可以创建一个自定义积木让代码更简洁一些。 创建一个用来运行本地克隆体代码的自定义积木 这里名字随意~可以自己发挥:
创然后我们将代码放进自定义积木中:
最后我们在判断后调用函数就可以了,是不是比之前简洁多了~
随后我们就再来写一个判断,用来判断是否是其他玩家的主体:
然后新建一个新的变量叫做 ID 并且设为私有变量,用来储存自己的ID:
然后我们将ID变量设为 data 对应的值:
就像这样,不过直接这样设为data的话那么这个ID里面就会有标识符我们并不需要这个标识符了 那么这个时候怎么办呢? 我们其实是不是只需要截取标识符后面的文字就可以了,没错! 首先我们按照惯例添加一个新的扩展:
那就是便利积木扩展! 然后我们直接按照标识符分割字符串然后取得第二项也就是标识符后面的字符串就可以了:
然后首先我们将造型切换成头部,然后将图层移动到最后面。
然后我们就来将位置等信息从云端同步到本地:
就像这样~。 然后就是将颜色特效也从云端同步过来了,但是我们的颜色特效数据是保存在额外数据里的json中的 那么为了更方便的读取我们来制作一个简易的自定义积木:
我们创建一个名为 获取云数据 的自定义积木,里面分别有ID参数和项参数 用来读取ID的额外数据的第X项, 并且我们勾选上运行时屏幕不刷新以及返回值积木。 然后我们再新建一个列表名为 额外数据缓存 并且是私有列表:
首先我们将玩家ID的额外数据覆盖到刚才创建的缓存列表中:
然后我们直接返回一个列表中的第参数项就可以了:
这样我们的简易获取数据积木就做好了,然后我们将颜色特效设为 获取云数据ID的第二项就可以了:
那么制作完头部之后那肯定就要来做贪吃蛇的身体了。
首先我们要用到arkos扩展中的列表功能:
我们将设置临时列表积木拖出来,将列表名改为ID 将列表内容直接设为云数据的第一项 也就是身体数据的地方。 但是这里会有一个问题,我们来观察一下贪吃蛇数据的样子。
我们会发现他并不是正常样子的列表 列入:[1,2,"apple"],所以我们需要给他转换一下。
我们先回到同步数据的地方, 然后我们直接将设为身体数据列表改为 设为将列表转换后的样子。
OK!然后我们继续回到克隆体的代码里面继续敲代码。
然后我们来创建一个新的自定义积木,用来初始化其他玩家的身体 并且勾选不刷新屏幕。
创建一个新的私有变量叫做 克隆身体循环。
我们刚开始将循环变量设为 0 然后重复执行一个我们身体数据列表的长度,也就是身体的长度,
并且每次循环都将循环变量增加1,
然后我们就要编写克隆贪吃蛇身体的代码了。
我们每一次循环时克隆一次贪吃蛇角色 并且将克隆体的数据设为 ID 连接 新的标识符 连接 循环次数, (这里我们给身体克隆体了一个新的专属标识符 这里我用的是 ℗ ), 这样我们的贪吃蛇身体的初始化就做好了,那么接下来我们回到克隆体的代码中, 我们来接着写一下如果贪吃蛇身体变长和变短的处理。
首先我们同步一下身体数据。
如果贪吃蛇身体的长度大于克隆身体循环 那么我们就按照多出来的数量克隆相应的身体。
我们再新建一个新的自定义积木叫做 贪吃蛇身体克隆 勾选不刷新屏幕, 然后我们来编写一下积木的代码。
其实就是将之前编写的初始化函数的代码复制过来然后将循环改为 循环 列表长度 - 循环次数 次。
然后我们将写好的自定义积木放到如果里面就可以了, 那么做好了贪吃蛇身体新增的处理之后肯定要做减少的处理。
如果贪吃蛇身体长度小于克隆身体循环。
我们就直接将克隆身体循环变量增加一个身体长度-身体循环就可以了, 这样我们就成功的实现了身体增加和身体减少的处理,那么接下来就让我们来编写身体的代码吧, 不过在此之前为了方便我们更顺畅的阅读代码我们先创建一个新的自定义积木。
叫做 其他玩家本地代码:
然后我们将刚才写的代码拖出来放进这个自定义积木里面就可以了。
这样我们就简洁多了! 好了 现在让我们正式开始来编写贪吃蛇身体的代码,
首先我们肯定要判断一下是不是贪吃蛇的身体。
然后我们来设置一下ID,直接按照标识符进行分割取得第一项就是我们的ID了。
然后我们创建一个新的变量叫做 ID2 并设为私有变量,用来储存身体的序列。
我们直接分割然后取得第二项就是贪吃蛇身体的序列了。 好了 我们ID初始化完成之后那肯定就是要让身体移动到对应的XY位置了。
我们先创建一个新的临时列表 列表名就是我们的data值,内容就是身体数据。
然后我们直接获取身体数据中我的位置。
随后我们直接移动到 我们的xy数据按照|分割获得第一项和第二项就可以了。
不过这个显然是过于的长了,所以我们可以编写一个自定义积木让他更简短一点。
名字就叫 获取位置的(参数)项 并且勾选返回值积木。
然后我们直接将这段长长的积木放进自定义积木里面并且将取得第X项改为取得第(参数)项 然后返回就可以了, 这样我们就可以直接:
优雅!实在是太优雅了。
然后我们添加一个循环来重复同步数据,先将大小同步一下 然后将刚才写的同步坐标代码复制一份到循环里面。
最后让我们来同步一下加速时候的颜色特效。
我们新建一个新的自定义积木叫做 其他玩家渐变效果。 然后让我们来编写这个自定义积木的代码。
如果 云数据ID的第二项(也就是颜色特性的值)等于0, 那么 我们就直接将颜色特性设为0就可以, 否则我们就将颜色特效设为 云数据颜色特效 + 贪吃蛇身体的序列。
然后我们直接将刚刚写好的自定义积木放进循环里面就可以了。 随后来写一下如果贪吃蛇长度变少那么就将此克隆体删除:
OK!就像是这样 如果我的序列位置大于贪吃蛇的总长度那么就代表这个克隆体已经被删除了, 那么我们就直接删掉就可以了。
最后我们再来将造型切换为身体造型就大功告成了,
在运行之前我们先来检查一下我们的代码有没有错误。
常见错误
诶,其实我在以上代码中故意写错了一个地方 不知道你们发现了没有 那么错误的地方是什么呢,
那就是:
没错,就是我的标识符写错了,原本应该是℗的地方写成了®。 这种BUG其实在代码编写的时候很常见 有的时候是变量忘记勾选私有变量了 或者是单词拼错了。 这些故障虽然看着是一个很小的错误 但实际上他会引发巨大的问题,所以我们写代码的时候要多注意一点~。
我们将错误的地方重新改成℗就可以了~。
最后搞定克隆体的代码之后我们就直接将初始化函数放进同步循环开始之前就可以了。 好!然后我们只差最后两个小东西就完成MMO的基础引擎制作了。
第四步 - 制作新玩家加入&退出房间处理
我们先来制作一下新玩家进入房间的处理,也就是给他也新创建个克隆体。
首先我们从MMO扩展中拖出 当新玩家连入的事件。
然后我们按照管理判断一下执行积木的是不是本体 如果是本体那么再判断一下是不是自己连入的事件, 如果两个条件都满足,那么我们就可以克隆新的克隆体了:
直接克隆一个新的克隆体,然后跟之前一样就把那个data设为标识符连接ID。 好了 这样新玩家连入处理就搞定了,接下来让我们搞一下如果有玩家退出游戏的处理。
当玩家离开时:
如果是克隆体那么就继续判断,如果ID等于退出玩家的ID 那么就删除克隆体就可以了。 好了!那么这样我们的基础贪吃蛇MMO引擎就搞定了。
首先我们把作品发布一下:
发布完成后这里如果你有朋友愿意帮你测试MMO那就可以直接来测试了~。 “诶 酷可酷可,如果没有朋友该怎么办啊” 那么这个问题非常简单,其实我们只需要同时开两个窗口就可以测试了:
好!那让我们来看看最终效果:
这里我为了方便演示将视野放大了许多~ 可以看到非常的完美!不过还是有一点小瑕疵的。
仔细看贪吃蛇,他的身体排序不太对。 那么这个问题应该怎么解决呢,其实很简单,
我们直接在贪吃蛇身体的代码中加入一个刚开始移动到最后面就可以了~。 OK,本小节结束~
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=snake/mckuke/Lec3/02&type=comment"
title="贪吃蛇中级教程-第三课第一节"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>