最新消息:380元/半年,推荐全网最具性价比的一站式编程学习平台码丁实验室

scratch云变量的另一点心得

Scratch 少儿编程 3169浏览 0评论

友情提示:380元/半年,儿童学编程,就上码丁实验室

如果你对云变量还没有初步的了解,那花一点点时间去看我另一帖也许会更有帮助,链接地址是:

https://www.kidscoding8.com/73113.html

 

在这里我会假定你已经了解了上一篇讲述的内容,准备用云变量交换更多的信息,比如,用云变量和你的朋友展开一次对战。

 

我们还是拿上次的范例开始分析,在上篇中,我们创造了肩并肩出现的两架飞机,并可以通过点击小飞机选择当前控制的对象,虽然这样的设计在大家合作的时候没有太大问题,但对战可就不合适了——如果对手在发动攻击时抢走了己方飞机的控制权,那战况就会非常的令人失望呢。

 

玩过网络游戏的朋友们应该知道,玩家操作的游戏程序只是一个客户端,虽然展示了游戏的内容,但游戏中的角色属性由服务器分配、角色在游戏中的生死离合由服务器控制、获取或消耗各种物品也由服务器判定,服务器调度了一切。尽管我们的Scratch拥有了云变量,但要用10个云变量实现服务器和客户端这样的两层模式,还是有点捉襟见肘的。何况还有一个更重要的问题,如果作为服务器的玩家突然关闭了游戏,我们怎么知道他已经暂时离开了争斗中的玩家们,并把权限分配给另一个在线的玩家呢?

 

所以面临的问题不只在于数据交换,还要确定玩家是否在线。总不能装一个摄像头在每个玩家身边,让他不停的在摄像头面前舞动吧?这样玩个游戏运动量也太大了。当然,付费玩家的操作可以是这样的。

 

 

画风虽然稍显凌乱,但这个逻辑似乎是对的,也就是让程序知道某一玩家持续在线的方法,就是在该玩家这一端 持续的 发送 不同的 数据,用Scratch的话来说,也就是该玩家操作角色时,即使角色不进行任何动作,也要 不断的 更新属于自己的云变量,而且每次都要与上次的不一样,这个操作方式叫做 心跳 

 

心跳!是不是让你掩卷长啸,是不是让你思如潮涌,是不是给你带来了无限灵感?

这是第二段

 

 

为了让我们操作更多的代码,我们必须先把现有的整理一下,请允许我有一点点代码上的强迫症,如果不能整理代码,也许我已经被源源不断的错误困住不能脱身了。

 

比如,之前的代码是这样的:

 

 

我们进行这样的整理:

 

 

得到这样的结果

 

 

然后我们把心跳放进去,你看,分好模块之后,我们只需要到相应的模块中修改,而不用在主干代码上下求索,寻找该更新什么地方了。

 

我们增加两个变量,一个叫  心跳码 ,一个叫  待更新内容,然后进行一番操作:

 

 

首先,把心跳码设置为100(好奇怪,为什么不是从0开始?)图示 1 处;

 

其次,在每次更新云变量的时候将心跳增加1,如果超过999,就将心跳还原为100;

 

再次,我们把 x 坐标和 y 坐标分别增加 340 和 280(好奇怪,为什么要做加法?),与心跳码一起拼接放入了待更新内容,图示 2 处;

 

然后,我们把方向处理之后带着用户名一起放入了待更新内容;

 

最后在一个单独的模块中,判断应更新哪个云变量,将它更新掉。(切记,为了同步一致,保持流畅,请不要在云变量上进行计算操作,操作时在临时变量中操作好,一次性更新进云变量。读取时也用临时变量缓存云变量,减少操作云变量的次数。)

 

 

我们将这一段奇怪的数字存入了云变量,为什么要这样做?

 

 

因为,云变量有10个数据的上限(好消息 :内容不限,长度可以很长),而我们现在要存入的内容比之前丰富很多,包括心跳码、x 坐标 、 y坐标、方向、用户名等,甚至后续还有其他的什么内容,所以我们将数据转换为 固定 的格式后拼接在一起保存,在使用的时候再用固定的方式拆分转换出来,这样一个变量就可以存放相对更丰富的内容。

 

所以,我们要统一数据存储的格式,比如 x 坐标,只要它在屏幕上,是一个整数,必然是-240 到 240之间,那么在增加 340 之后,获得的就一定是一个三位的正整数;比如 y 坐标,-180到180之间,我们给它增加280,它就一定是一个三位的正整数,这样我们获取的时候只需要在云变量中的第4-6位拿到数据,减去340,就还原出了x坐标,而y坐标就静静的藏在7-9的位置,等待我们用减去280来还原。

 

在这里我们把1-3的位置留给云变量,为什么云变量也要用三位数字来保存呢,这是预留给网络延迟的一点点余地,防止因网络卡顿,造成程序的过快踢人。

 

同样的道理,我们将方向整理为100-459之间的数字(0-359之间的数字增加100) ,放入10-12,而最后的一节,我们放入用户名,因为用户名的长度是不可控的,所以从13开始到结束,就是玩家的用户名。

 

接下来,我们需要更新一下  展示别人的飞机   段落。

这是第三段

 

我们将代码飞快的修改成下面这样,不要有畏难情绪,既然我们爬云变量这座小山已经爬到了85%,难道你还没有信心冲上顶峰吗?跟上跟上!

 

 

箭头 1 的位置如上小段所讲,是让本体跟随移动,并将自己的位置更新到对应的云变量

箭头 2 和 3 分别按仓库标记执行相应的模块,游戏区的大飞机循环读取坐标和方向,仓库的小飞机等待玩家的选择,你看,把代码折叠进模块里是不是让代码相当的清晰~

 

接下来,我们看看展示别人的飞机模块,别着急,虽然代码多,但我相信阅读起来并不辛苦。

 

 

先通过飞机编号获取指定的云变量,将它保存在  临时变量 中 (还记得之前的介绍吗?不要反复操作云变量,最好一口吞下来,再用本地变量消化它),然后检查 历史心跳 和获取来的内容是否一致,如果相同,则表示该飞机机主出现状况,我们丢入 本机故障 处理,否则,更新历史心跳,显示该飞机,并将 X 坐标、Y坐标、方向更新进去。

在故障处理中,我们为了避免网络延迟直接踢出玩家,我们进行了一个 60 次试探等待,虽然说的这么高大上,其实只是一个判断语句而已,相信这个不用解释你也看的懂~~

 

然后我们完善 等待玩家的选择  代码,看上去很吓人,其实眼光锐利的朋友们一眼望去还会提出修改意见(强力读者:这不是最优的写法!作者君战战兢兢汗如雨下的回答:是的,但这是更简单的写法——):

 

 

同样是按飞机编号获取云变量内容,同样是检测心跳,同样进行了错误处理,只是这里我们不读取 x \ y \方向,而是用一个循环获取附在变量末尾的用户名。这里我要考一考朋友们了,为什么我会说这个地方不是最优的写法呢?请拿起你的手机点击回复参与互动,参与者将有机会获得作者的 王者祝福 一次!

 

现在我们把飞机仓库限制起来,在机主在线的情况下,不再允许抢夺该飞机的控制权,而是显示机主的名字。

 

 

现在似乎就完成了……我们看看效果

 

 

如果你是一路认真阅读到达了这里,相信你对云变量有了更大的创作热情;如果你在阅读中有什么不理解。请移步到程序中,看看完整的代码,相信一定会让你拨云见日,豁然开朗。

 

我当然会把链接贴过来了,读者大人——  https://kada.163.com/project/575371-476231.htm

 

这篇心得就差不多结束了,也许你会说这个游戏一点都不完善,没有声音、没有特效、开始界面没有整理、不能真的对打、操作起来不方便、还不能升级等等。确实是这样,但是请谅解,如果我在范例中设计了那些,就会淹没我们本来要讨论的主体  云变量 的 心跳 。

谢谢你的阅读,我不怀疑你对云变量的热情,所以推荐你能按照这个进度自己做一遍,而不是改编这个游戏。相信你会在其中收获更多。我就在这里等你,等待你的弯道超车,如果你超过我,我就要超过你~~~!

 

您必须 登录 才能发表评论!