在Scratch中,一个角色内部可以包含多个图片,软件中称为造型(costume),这些造型的切换为实现动画及其它效果提供了非常大的方便。但是在造型使用的过程中,可能出现引用的问题,其根源在于造型的命名。
下面我们举一个简单的例子来演示这个问题。
制作一个程序,目的是显示0-9的数字,思路是在一个角色中放置10个数字的图片,之后使用切换图片的方式进行显示。
打开Scratch制作,创造一个角色。之后,手工绘制(或导入)0-9的数字图形(画的不美观,不影响分析问题)。
可以看到,SC默认为造型起的名字是“造型1”,“造型2”等等。既然我们使用的是数字0-9,很自然会想到用0-9对造型进行命名。而且排一下次序,0在最上面,9在最下面。操作后如图所示。
下面做程序试验一下,按下空格后切换到指定的造型。最基本的用法应该是这样了。
这个没有问题,在按空格后角色显示为数字2。由于在程序中常常使用变量对造型进行引用,定义一个变量A,将A赋值后再控制造型,程序如下。
试验一下,也没有问题,能够正确显示出2。但在程序中,我们常根据计算得到的结果来决定显示哪个造型。我们再修改一下程序,计算得到A后显示造型,这样更加接近实际应用。让我们来求一下“1+1”等于几。
结果应该是几呢?大家可以试验一下,看看结果如何。按下空格,出现的是:
哦哦,出问题了,1+1=1。而且从变量监视能看到,A的值为2是正确的。为什么会出现这样的结果呢?
这事情说来话长,涉及了两个技术问题:
第一个问题是Scratch中的变量类型
大家知道,变量是分类型的,包括字符串类型、数字类型、逻辑类型、日期类型等。但Scratch中没有显式地说明每个变量及常量的类型,软件内部会自动地进行变量类型的转换。在一般使用时,为大家带来了方便,但有时会带来麻烦。
第二个问题是对造型的引用。
在Scratch对造型进行引用时,使用了两套方式,一种是使用造型的名称进行引用,另一种是根据造型的序号进行引用。在使用一个变量使用“将造型切换为”来引用造型时,如果变量是数字型的,Scratch就按序号操作(从1开始),如果变量是字符串,SC就按造型的名称操作。
再来分析上面的例子,如果把变量直接赋值为2,软件认为变量的类型是字符串(合理猜测),所以SC会按名称来寻找对应的造型(在我们这里找到了名称为“2”的造型,得到了正确的结果)。但一旦通过数学计算得到一个值,SC就会认为这个值是数字类型,使用它引用造型时就会当成序号来进行引用(第2个图片是数字1),造成了1+1=1的错误。
结合上面的分析,我们就知道,当造型的序号和名字不一致时,会造成引用的二义性,可能发生错误。
那么,如何解决这个问题呢?可以有两种方式:
方式1 统一使用序号来引用。
所有的造型都使用字符串为名称,只使用序号靠列表中的次序来引用,这样有利于进行“下一个造型”等操作。但使用这种方法必须保证造型的次序是正确的。在图片比较少时,不会产生问题,在图片比较多时,通过拖动调节造型的次序是一个费时费力又容易出错的过程(想象一下调节60个用于显示分或秒的“00”到“59”图片的次序J)。而且如果在前面插入或删除了造型,后面造型的序号都会发生变化。还有,由于软件中用于引用的序号都是从1开始的,用于表示带有数字0的数列总是很麻烦和别扭。
方式2 统一使用字符串名称来引用
为了保证名称是字符串而不被误认为是数字,可以在数字前或后加字符作为造型的名称。例如,以N为前缀字符,可以将数字0-9的造型命名为N0,N1….N9。在引用时,通过字符串的连接生成用于引用的造型名称就可以了,造型的命名如下图所示。
在程序中使用如下的方式进行引用。
这种做法的优点是,不需要调节造型在列表中的次序,便于从外界导入图形,在程序中易于使用变量进行引用。甚至通过使用不同的前导字符,可以在一个角色中保存多套造型。
总结
1 在为造型起名字时,需要考虑是否会造成二义性的引用。对于背景的不同图片引用,也存在相同的问题。
2 用字符加序号的命名方式,对于程序控制造型的切换是比较方便的。
作者 Marvin QQ:837350308
此文章首先发布在微信公众号。HaiyouEdu
下面我们举一个简单的例子来演示这个问题。
制作一个程序,目的是显示0-9的数字,思路是在一个角色中放置10个数字的图片,之后使用切换图片的方式进行显示。
打开Scratch制作,创造一个角色。之后,手工绘制(或导入)0-9的数字图形(画的不美观,不影响分析问题)。
可以看到,SC默认为造型起的名字是“造型1”,“造型2”等等。既然我们使用的是数字0-9,很自然会想到用0-9对造型进行命名。而且排一下次序,0在最上面,9在最下面。操作后如图所示。
下面做程序试验一下,按下空格后切换到指定的造型。最基本的用法应该是这样了。
这个没有问题,在按空格后角色显示为数字2。由于在程序中常常使用变量对造型进行引用,定义一个变量A,将A赋值后再控制造型,程序如下。
试验一下,也没有问题,能够正确显示出2。但在程序中,我们常根据计算得到的结果来决定显示哪个造型。我们再修改一下程序,计算得到A后显示造型,这样更加接近实际应用。让我们来求一下“1+1”等于几。
结果应该是几呢?大家可以试验一下,看看结果如何。按下空格,出现的是:
哦哦,出问题了,1+1=1。而且从变量监视能看到,A的值为2是正确的。为什么会出现这样的结果呢?
这事情说来话长,涉及了两个技术问题:
第一个问题是Scratch中的变量类型
大家知道,变量是分类型的,包括字符串类型、数字类型、逻辑类型、日期类型等。但Scratch中没有显式地说明每个变量及常量的类型,软件内部会自动地进行变量类型的转换。在一般使用时,为大家带来了方便,但有时会带来麻烦。
第二个问题是对造型的引用。
在Scratch对造型进行引用时,使用了两套方式,一种是使用造型的名称进行引用,另一种是根据造型的序号进行引用。在使用一个变量使用“将造型切换为”来引用造型时,如果变量是数字型的,Scratch就按序号操作(从1开始),如果变量是字符串,SC就按造型的名称操作。
再来分析上面的例子,如果把变量直接赋值为2,软件认为变量的类型是字符串(合理猜测),所以SC会按名称来寻找对应的造型(在我们这里找到了名称为“2”的造型,得到了正确的结果)。但一旦通过数学计算得到一个值,SC就会认为这个值是数字类型,使用它引用造型时就会当成序号来进行引用(第2个图片是数字1),造成了1+1=1的错误。
结合上面的分析,我们就知道,当造型的序号和名字不一致时,会造成引用的二义性,可能发生错误。
那么,如何解决这个问题呢?可以有两种方式:
方式1 统一使用序号来引用。
所有的造型都使用字符串为名称,只使用序号靠列表中的次序来引用,这样有利于进行“下一个造型”等操作。但使用这种方法必须保证造型的次序是正确的。在图片比较少时,不会产生问题,在图片比较多时,通过拖动调节造型的次序是一个费时费力又容易出错的过程(想象一下调节60个用于显示分或秒的“00”到“59”图片的次序J)。而且如果在前面插入或删除了造型,后面造型的序号都会发生变化。还有,由于软件中用于引用的序号都是从1开始的,用于表示带有数字0的数列总是很麻烦和别扭。
方式2 统一使用字符串名称来引用
为了保证名称是字符串而不被误认为是数字,可以在数字前或后加字符作为造型的名称。例如,以N为前缀字符,可以将数字0-9的造型命名为N0,N1….N9。在引用时,通过字符串的连接生成用于引用的造型名称就可以了,造型的命名如下图所示。
在程序中使用如下的方式进行引用。
这种做法的优点是,不需要调节造型在列表中的次序,便于从外界导入图形,在程序中易于使用变量进行引用。甚至通过使用不同的前导字符,可以在一个角色中保存多套造型。
总结
1 在为造型起名字时,需要考虑是否会造成二义性的引用。对于背景的不同图片引用,也存在相同的问题。
2 用字符加序号的命名方式,对于程序控制造型的切换是比较方便的。
作者 Marvin QQ:837350308
此文章首先发布在微信公众号。HaiyouEdu