一、 克隆简介
自从Scratch 2.0中引入克隆技术,程序中许多任务可以通过克隆技术更为高效地执行,而不再需要创建大量的精灵。克隆体实质上就是精灵的实例,这意味着它们继承了精灵的属性,但另一方面也是独立的对象。克隆体通常可能要执行与母体精灵稍有不同的任务,但一个关键的问题是:克隆体和母体精灵都对几乎所有事件块(触发器)能够做出响应。这样一来,专门为母体精灵设计的触发器在发出信号时也能够由克隆体运行。
实际开发中,当需要许多相似的精灵完成相似的任务时,就应该主动考虑到使用克隆技术。因为克隆是由程序而不是用户实现的,所以克隆的运用可以让用户不需要对许多精灵中的每个精灵进行相同的更改。因此,克隆技术可典型地应用于开发:
- 塔台防御小游戏(例如在地图上有大约200个塔台)
- 许多街机风格的游戏
- 子弹精灵(你想要多少就有多少,需要多少不同的角色就有多少)
- 复杂或半复杂粒子系统
- 烟火、雪等特效
- 鼠标轨迹
- 任何需要大量重复精灵的项目
【高级应用提示】Scratch中的克隆可以使用积木命令【当作为克隆体启动时】递归地克隆自身,有兴趣的朋友可作这方面更深入的探讨。
二、 借助变量管理母体与克隆体
先来看以下简单的代码:
【结论一】如果单击包含上述脚本(第二段)的母体的克隆体,则克隆体本身就会执行第二段代码。
如果只要求母体而不是它的克隆响应上面的代码,那么我们可以通过使用私有变量的办法来规定哪个对象(可以是母体,也可以是子克隆)运行哪个触发器。
【结论二】如果不使用私有变量,则所有克隆体都将共享使用同一变量。
三、使用私有变量
私有变量可以用于存储单个母体精灵和各个克隆体的值,尽管它们具有相同的名称。例如,三个克隆体可以有一个名为“X方向速度”的变量,但是每个克隆都可以有自己的变量值。
类似地,母体精灵可以将其私有变量设置为特定字符串,而每个克隆体都可将其设置为不同的值。类之间不同变量值的概念允许选择母体精灵或子克隆体运行哪些代码。
【提示】熟悉面向对象编程的朋友应该对“继承”概念不陌生吧,父类可以派生出多种子类,而子类可以拥有与父类相似但又不同的各自特征。至此,大家应该对Scratch面向对象编程技术有更为深刻的理解了吧。
例如,我们想实现单击绿色标志时,立即删除所有克隆体,但母体精灵仍存在。下面,还是让我们通过具体的小例子来说明问题。
例1:克隆体行为与母体精灵不同
要实现这样的目的,首先请考虑在母体中编写下面的代码:
易知,保存在变量“instance”中的这一小段数据只显示该母体精灵是一个“精灵”。注意,要实现上述目的,“instance”必须是私有变量;否则将无法工作。接下来,必须指定一个脚本,为所有克隆体分配一个显示它们是“克隆体”的变量值。以下脚本可以完成此操作:
显然,只有克隆体才能执行这段代码!
上面的脚本不会更改母体精灵的变量“instance”的值。相反,每个克隆体都有自己的变量“instance”。
完成上面的两段编程后,变量“instance”和if语句相结合,就可以正确地将触发器指定为仅为母体精灵或其克隆体运行。
再来看下面的代码:
上面的脚本只适用于克隆,这是显而易见的,因为母体精灵的变量没有设置为“clone”,母体精灵不会执行此if块中的语句。请注意:上面这种使用“变量”的方法也是Scratch项目开发中调试克隆引起问题的非常有效的方法。
例2:克隆体行为彼此不同
下面的示例演示如何在单个母体精灵的脚本中管理多个克隆体类型。请注意,在生成每个克隆体(或一组类似克隆体)之前,会为专用变量“type”分配一个值。如果母体精灵要忽略广播,则应在生成克隆体后但在接收到广播消息之前设置其自身的唯一值“type”。
注:代码中type是私有变量。
私有变量“type”的值由每个克隆体从母体精灵继承,而母体精灵却会忽略接收广播的消息,因为它自己的“type”值不同。这种技术允许许多不同的克隆体类型以各自独特的方式工作。
小结
本文并没有给出复杂的完全例子,但是仅通过简短的小例,足以说明了仅凭借变量的全局性与局部性的巧妙运用即可实现Scratch复杂开发中母体与克隆体间差异行为的有效管理。在后面的博文中,我会进一步给出Scratch复杂开发中克隆技术的其他应用注意事项,并给出更系统完整的案例,敬请期待。