克隆技术是时下热门的Scratch少儿编程考试或者竞赛必须面对的重点与难点之一。本文试图从较高的层面探讨Scratch编程中克隆技术的本质,并进一步把克隆技术的应用划分为两大类型——共享数据克隆体和非共享数据克隆体,最后给出各自的应用举例。编程
对于初、高中对面向对象编程概念没有基础的小朋友,能够略过本注释的阅读转而进行第二小节的阅读。熟悉其余高级编程语言的朋友都了解面向对象编程,其三种特征(封装、继承与多态)都在Scratch中获得很是天然与形象的体现。在此暂不赘述,有兴趣的朋友可多多联系这些概念,从而更有助于理解Scratch中的克隆技术。小程序
编程中,当须要大量类似的精灵完成类似的任务时,建议主动考虑使用克隆技术。其实,经过大量应用克隆技术的案例分析后,整体概括一下,克隆体不外乎以下两大种类型:数据结构
在之后的文章中我会经过全面的应用实例来展现这里的结论。在本篇中,咱们仅经过典型的小例来讲明问题。编程语言
这种类型的克隆体不须要共享信息,所以这种状况下问题比较简单。ide
制做非共享数据克隆体的一种方法是根据建立克隆体的顺序为每一个克隆体指定一个标识号。且看下面的举例运行时截图。设计
一、快照3d
设计想法是:当游戏开始时(点击绿色小旗子),母体(黄头猫)生成本身的三个克隆体,并在不一样位置显示;而后各自发言。造型设计以下:对象
下面,咱们来看相应的编程实现。
二、编程分析
首先,须要定义如下变量:blog
先来看母体代码:继承
如前所述,当点击绿色小旗开始程序执行时,母体生成三个克隆体。
【问题】为何上面的变量定义为局部变量?其实,看过我前面文章( http://www.javashuo.com/article/p-uyswxyjc-de.html Scratch高级编程之妙用变量管理母体与克隆体 )的朋友均可能理解了在克隆体编程中局部变量与全局变量在克隆体编程中的奇妙做用。稍后的代码中还会说明这一点。
接下来,咱们分别为每一个克隆对象启动下面脚本(积木【看成为克隆体运行时】的做用):
你们先略过代码【说(你好)】这一句,往下看。意思是:根据变量lvID的当前值,克隆体切换成不一样的对应造型并修改自身其余属性。
【问题】若是有须要全部的克隆体当即都要作的事情,怎么办?
【方法一】如上面代码所示,能够在条件语句以前放置相应的命令块(此处只有一句问好)。
【方法二】或者说是更推荐的作法是,将这些命令块放在另外一个“看成为克隆体启动时”中。
【小结】至此,咱们实现了既定目标:根据指定顺序生成克隆体对象。
接下来,咱们来简单介绍一下局部变量与全局变量在克隆体编程中的区别。这里只使用代码展现一下:
首先,在母体角色(黄头猫)引入一个全局类型变量“gv克隆体计数器”。简单修改一下母体代码以下:
意思暂时不用解释了。接下来,添加以下代码:
咱们想点击每一只猫时让它说出对应的数据,显然触发器“看成为克隆体启动时”中的代码块只有克隆体执行,而其余地方的代码母体与克隆体都要执行。所以,上面的代码是母体与克隆体都要执行的。
执行结果截图以下:
绿猫一开始说出本身的“lvID”值,稍后说出全局变量“gv克隆体计数器”的值,以下图:
点小红猫,显示以下:
其余省略......
熟悉面向对象编程的朋友,若是结合变量(也称做“属性”)的继承来理解这里公有变量与私有变量区别的话,相对更容易一些。
在更多状况下,例如在开发炮塔类游戏的状况下,方向、造型及其余属性的组合很是之多,简直数不胜数。在这种状况下,典型的方法是将这些属性(方向、造型等)直接定义为一些全局变量——这些变量不属于某一种角色,从而使得各类游戏角色(包括各类角色的克隆体)均可以操做这些变量。虽然这样的方案(定义不少的全局变量)也带来总体数据管理的复杂性,但这种办法也确实是由软件自己的复杂性和Scratch的局限性不得已而肯定的。
接下来的代码片段中,咱们只做部分关键代码的展现,在之后的文章中我还会开发出完整的小游戏来展现这些技术的应用。下面是一个简单的空战小游戏的截图(尚不完善,因此只给出与本文主题直接相关的代码分析)。
简单快照
固然,实际空战游戏中,会有我方与敌方的许多战机(以及类型),子弹或者炮弹数量及类型更多是不少种且数量更大。
数据结构定义
基于上面分析,咱们须要针对子弹的多种属性建立许多全局变量(而不是局部于子弹角色的局部变量!)。在本例中,将使用如下定义:
关键代码一
每当想让我方战机角色开始射击时,能够把下面脚本放在某个触发器中(好比在按下空格键以后,或者某种状况下):
再看子弹角色造型设计:
固然,为了简化问题,咱们只设计了两种造型:一种是我方子弹,一种是敌方子弹。
关键代码二
相应于上面的代码,做为子弹角色,典型的克隆体执行代码设计多是:
至此,咱们给出非共享数据克隆体w使用的第二种更典型的情形分析。
接下来,咱们来看相对复杂的共享数据克隆体应用的状况。
如前所述,本节中讨论的“共享数据克隆体”是指其余精灵(包括母体精灵)或克隆体须要访问当前克隆体的私有数据,例如它的位置、造型名称与编号等。
这里提供一种通用技巧就是,将克隆体的各私有数据存储在若干个对应的全局列表中,从而实现其余精灵能够访问特定克隆体的特定数据(属性值)。
由于本处的例子也是小例,可是为了有助于后面理解,先上运行时快照的第一个。
注意:本例中,母体是老黄猫!
要建立共享数据类型的克隆体,须要如下数据结构:
本代码实现了三点主要功能:
(1)母猫站在舞台左上角(说出本身的身份),两个全局变量初始化
(2)经过执行4次的循环,建立4个克隆体,并初始化一个(这里只有一个!)全局列表变量
(3)还原母体造型(由于通过循环中的不断切换造型的克隆操做后,母体造型有所改变)
【问题1】为何这里造型名称列表内容是空的?
【问题2】私有变量“lv克隆体编号”为何没有在这里露头?
含义:每只小猫变得小些;私有变量“lv克隆体编号”在此出现,用于存储当前克隆个体编号(这个编号正在存储在产生本个体时的全局变量中)。而后,调整一下自身位置,并报出本身的个体编号。最后一句比较关键:把当前克隆体造型名称存储在全局列表变量中。
【思考】上述代码中,可否把最后一句中的变量“lv克隆体编号”使用全局变量“gv克隆体计数器”代替?为何?
很简单,当点击任何角色(包括母体)时,报出本身的造型名称。
【问题】当点击母体时,报出本身的造型名称是否正确?根据Scratch支持特征,尽管母体中仍然能够访问私有变量“lv克隆体编号”的值,可是其含义已经“歪曲”了!请认真思考。固然,有“面向对象编程”概念基础的朋友,是不难理解这个问题的。
由上面第三段代码知,咱们的设计目的是:当用户按下空格键时,让2号小猫思考“妈妈在哪?”这个问题,并经过Scratch消息广播技术寻找妈妈。
在第四段代码中,妈妈接收消息时,报出本身的身份。
乍看起来有点复杂,可是结合我前面发的两篇克隆文章并结合本文前面的介绍,在真正理解了全局变量与私有(也称“局部”)变量在克隆技术中的特殊用法后,上面的问题确定会豁然开朗。有关截图以下:
小猫思考:
猫妈妈回应:
其实,咱们还能够将两种克隆体结合起来使用,在共享数据的同时建立不一样类别的克隆体,从而建立功能更强大的游戏、创新创意小程序……
本文结合Scratch克隆体应用的各类情形,大胆地把克隆体使用的各类场景归结为两种类型,即“共享数据克隆体”和“非共享数据克隆体”,并给出各自的应用举例。实践需求是复杂的,也灵活多变。此外,咱们还有可能将两种克隆体结合起来使用,便可以在共享数据的同时建立不一样类别的克隆体,从而建立功能更强大的程序。本文中如有概念或结论不当之处,请读者朋友批评指正!
(https://blog.51cto.com/cloumn/detail/88 本人拙做,欢迎交流)