3.5 摩托车——循环嵌套
在前面的章节里,我们使用了循环,但循环中的命令是一个或者一组命令,那么循环里是否可以再加入另一个循环呢?答案是肯定的,而且在计算机里有个特殊的称呼:循环嵌套。意思就是我们前面讲的循环的里面还有一个循环。
我们来看一个摩托车的运动场景。
背景:野外(blue sky)
角色:车架,两个车轮,站在车上的小姑娘Anna,一棵“很重要的”树
玩法要求:
Anna坐着摩托车出去春游。
随着摩托车在道路上行驶,树也不停地向后移动。
Anna心情十分愉快,高兴地举着双手(见图3-23)。
问题分析:在这个故事中,我们可以看到重点是摩托车的行驶。为了展示车的移动,我们可以有两种方法,第一种方法是让车移动起来,车轮转起来,车上的人跟着车一起移动,但带来一系列的复杂问题,例如人如何随车移动,为了让车和人一直移动,到了舞台最右时,需要让角色都移回最左侧……这种方法太复杂了,我们可以考虑另一个办法:车本身是不动的,但是让代表背景的树动起来,那么从视觉上讲,你也会感到人和车在运动。这也是拍电影的常用方法。
图3-23 摩托车
好吧!我们已经确定了车不动,树动的方法,那么首先让树动起来。
树的动作分析如下:
1)从舞台右面向左面移动。
2)到达舞台的左面时移到舞台的右面。
3)反复执行上面两步。
我们一步一步来完成,首先解决树从舞台右面向左面移动,在这个任务中,同样需要细化,然后分步骤来解决。如同生活中一样,你去一个地方,首先要确定向哪个方向走,然后根据你的需要,开始快步走或慢步走,如果你走一步的距离是一样的,那么你走固定的步数就到了。在这里,树就像你,舞台左面就是你的目的地,在用程序实现时,同样也要先确定移动方向,然后开始移动。
在Scratch中,决定移动方向的命令还记得吗?在第2章的“代码画家”里,我们曾经用到过。对了,就是它——,移动的命令相信你也不陌生:,当然只移动10步是不够的,就像上面我们说的,你要走很多步才可以到达目的地一样,需要反复执行这个移动命令,然后才能到达目的地,也就是要让循环执行这个命令,注意这里循环的次数是有限的,你可以去试一试多少次比较合适。完成后的程序如图3-24所示。
图3-24 树从舞台右面移到舞台左面
那么,我们如何让树移回到舞台右面呢?在程序命令区的“动作”标签里有一个命令,它可以直接实现这个任务:。
这个命令把舞台的各个位置用两个数来代表(x:,y:),如果你学过坐标系那么很容易理解,如果没有,也没关系,你同样可以使用这个命令,具体的方法是:在程序不运行的情况下,把角色先拖到你需要的位置,这时,程序命令区里的这个命令所代表的位置就是角色现在的位置,你只需要把这个命令拖到程序工作区就可以了,每次运行这个命令,角色就会移到这个位置。
现在把这个命令添加到图3-24的程序段的下面,然后再加上“当被点击”命令,再单击绿旗看看发生了什么:树可以动了!它从舞台右面移到舞台左面,然后又直接回到舞台右面。
等等,有一个问题:它为什么是倒着的?这是Scratch内部的一个设置,当你使用改变方向的命令(例如“面向…”,“向…旋转…”)时,角色会在舞台平面内进行旋转,你可以通过程序命令改变这种设置。这个程序命令如图3-25所示。
图3-25 改变角色旋转模式的命令
在不进行程序设置的情况下,Scratch会默认为“旋转模式”是“任意”,如果设定为“左-右翻转”,也就是直接将这个命令拖出来,那么我们就可以让树保持正常向上的状态了。
解决了这个问题,接下来如何让树不停移动呢?在3.3节,我们学习了无限次循环,想到了吧:只要把图3-24的程序“塞到”无限次循环里就可以实现树的任务了(见图3-26)。
图3-26 树的程序
图3-26的程序中有一个特点:在循环里还有一个循环,这就是我们这一节要重点讲述的——循环嵌套。
你现在可以运行下你写完的程序,是否感觉不太真实?怎么样才能更真实呢?既然要有运动效果,那么车轮应该是一直在转的,这样搭配起来,效果就会展现出来!
车轮旋转的分析我们就不多说了,和3.4节的方法很类似。具体程序可以参见图3-21。