临时容器
下面介绍一个有用的东西——“临时容器”。
要使用临时容器,首先需要在扩展库中安装 Arkos 扩展:
临时数据
先简单介绍一下“临时数据”。Arkos 扩展中包括一个“临时数据”模块。临时数据包括三类:临时变量、临时列表、临时容器。
注:之所以叫临时数据,是因为这些数据不会被保存在作品中:重新加载项目,临时数据会被清空(但是点击绿旗重新运行,临时数据不会清空)因此,除了不会被保存在作品中,临时变量、列表可以当成普通变量、列表一样使用。
临时变量
和普通变量用法完全一样。(如果设置的临时变量不存在,会自动创建)
临时列表
和普通列表用法也完全一样。
其中,下面的两个积木都可以创建临时列表。而第二个积木会读取 JSON 字符串覆盖到列表中。
可以简单理解为,将数据(如列表)写成字符串的一种表示方法。
例如,列表中有内容:1、2、aa、苹果。则表示成 JSON 就是:[1,2,"aa","苹果"]
(用方括号[...,...,...]来表示列表,如果内容是字符串,则会用双引号括起)
此外,使用下面的积木,可以获得列表的 JSON 格式:
顺带一提,使用 Gandi 数据助手,也可以对原版列表执行类似的操作:将列表转 JSON 字符串,或读取 JSON 到列表:
临时容器
接下来,介绍临时变量、临时列表以外的第三种数据结构——临时容器。
容器的用法很简单。在列表中,我们通过编号来获取列表的某一项;而在容器中,我们直接通过名称来获取某个数据。
例如,我们可以设置容器中的“苹果”为 5,然后读取“苹果”。
此外,通过“名字”来获取“值”的这种方式称为键值对。像前面多莉扩展,“key = value”的形式就是键值对,如“血量=100”,即将血量设为 100.
此外,和列表一样,容器也能转换为 JSON 字符串:
容器用 JSON 表示为 {...},用大括号括起来。而列表是用[...],中括号括起来。
例如,容器中有如下内容:苹果=5,金币=100,袋子="一些金币"
那么,容器就可以表示为JSON:{"苹果":"5","金币":100,"袋子":"一些金币"}。
或者,也可以写成下面更清晰的方式:
{
"苹果":"5",
"金币":"100",
"袋子":"一些金币"
}
和列表一样,也可以将 JSON 解析到容器中:
一些注意事项
- 如果读取的临时数据不存在,会返回“undefined”。类似的,如果读取容器中不存在的内容,也会返回“undefined”
这实际上是扩展制作时的漏洞,在未来有可能会修复为返回空值,所以不建议使用这个特性。如果想判断某个内容是否存在,使用下面的积木:
- 临时变量虽然用起来很方便,但是运行速率上会比使用原版的变量稍微慢一点点,因此不建议用临时变量完全替代原版变量(同样的,多莉扩展的键值对、临时容器的键值对、以及返回值自制积木过多使用似乎也容易造成卡顿,不建议大规模使用)
- 重新运行作品,临时数据不会自动清除。可以使用下面的积木手动清除所有临时数据:
但是请注意:如果设置了点击绿旗清空所有临时数据,就不能在点击绿旗后立即使用临时数据,否则可能出现先创建了临时数据,随后就被删除的情况:
为了解决这个问题,可以使用“等待 0 秒”:
- 在 Gandi 数据助手扩展中,有下面的 JSON 处理积木:
可以使用下面的代码,来用变量实现类似临时容器的效果:
但是,这种写法效率是非常低效的,最好不要用于需要频繁读取、修改的情况。(当然如果只是一次性的使用,下面的写法也是可以的)
这是因为,变量本质上存放的是一个字符串,运行下图左侧的积木,每一步都先将 JSON 字符串解析为容器,然后再读取容器中的值。由于将 JSON 解析为容器是低效的操作,因此不推荐使用左边的做法。
练习使用临时容器:
- 在中级篇中,我们使用了很多变量,来记录地图的相关信息:
我们可以用容器来替代,将地图相关信息收纳到一个容器中:
- 制作更好用的克隆体引擎:
在上节课,我们实现了一个简单的克隆体引擎:
但是,克隆体 id 是由 Scratch 随机生成的。我们能否实现这样的效果:直接指定克隆体的 ID,这样就可以直接根据设置的 ID 方便地获取数据?
虽然 Scratch 不允许我们直接设置克隆体的 id,但是我们可以为克隆体设置一个“虚拟id”(这里直接记为大写的“ID”)
例如,有一个 id 为 abcd 的克隆体,我们希望用 ID “玩家”来指代它。当读取“玩家”的数据时,实际上读取的是“abcd”的数据。
要实现这种效果,就可以用临时容器,记录每个“ID”对应的实际“id”:
将引擎改进如下:
- 首先,对每个克隆体,我们使用如下两个概念:
- id,表示克隆体的真实 id,可直接在多莉扩展中使用。
- ID,表示克隆体虚拟 ID,在克隆时可以指定。如果克隆时没指定,ID 和 id 保持一致。
- 这样,我们平时使用的时候可以统一用 ID 来表示克隆体,将真 id 隐藏起来。
- 克隆时,如果指定了 ID,则保存 ID 对应的实际 id;
- 获取克隆体数据时,先检查传入的 ID 是否有对应的真“id”,否则还是使用传入的值:
“如果否则”也可以替换成如下的便利积木:
这样,我们就实现了克隆时,指定 ID 的效果:
上一节:02 多莉扩展
下一节:04 小结
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG303/Arkos/Lec1/03&type=comment"
title="{射击课高级篇-第一课-03}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>