Scratch第十八讲:如何正确实现背景的滚动

网友投稿 2018-09-22 15:16

从这次开始,CC哥会每期都挑一个做的不错的Scratch的小作品,展示给大家,大家可以通过观察别人的设计来观察这些作品的细节,提升自己作品的设计和技巧。今天给大家看一个装冰激凌的小游戏,大家欣赏一下。

https://cdn.china-scratch.com/timg/180924/15155A4M-0.gif

这个小游戏并不难,就是用一个空格键操作,按住空格键不放,冰激凌就变大,松手,冰激凌就落下来,每次放的冰激凌球必须比上一个小,否则冰激凌塔就会倒下来,大家自己也可以做做试试。

———— / 正式开讲 / ————

当我们玩赛车游戏,跑酷游戏,飞机大战也好,特别是RPG的游戏的时候,都会发现背景地形,或者地图,随着角色的移动,在向后滚动,也就是通过背景向后滑过,来显示角色在运动。是不是马上联想到了电影里女猪脚策马狂奔的片段https://cdn.china-scratch.com/Public/Home/images/grey.gif

https://cdn.china-scratch.com/timg/180924/15155935R-2.gif

今天CC哥就来跟大家讲一下背景滚动在Scratch里如何实现的。其实很简单,就是把背景做成几个角色,拼接在一起,然后不断上下或左右循环滚动就行了。

https://cdn.china-scratch.com/timg/180924/1515595E7-3.jpg

是不是一点也不复杂,角色1的位置为0,0,也就是Y轴起始点为0,角色2的位置为0,360,也就是Y轴起始点为360。然后两个角色同步向下运动,看上去就象是背景在滑动了。要实现这个代码不难。

——https://cdn.china-scratch.com/timg/180924/15160064S-4.jpg

小技巧,作为背景,两个角色的上下拼接一定要严丝合缝,这里有个小技巧,你做好角色1后复制一个角色2,然后用右上角的上下翻转按钮就可以得到严丝合缝的角色2。(中间的赛道一定是透明的,否则将来做小车的碰撞测试时就会出问题。)

——

让我们看一段程序,这是很多老师都会这样教这样做:

———— / 角色1代码 / ————

https://cdn.china-scratch.com/timg/180924/1516001T9-5.jpg

———— / 角色2代码 / ————

https://cdn.china-scratch.com/timg/180924/1516001553-6.jpg

———— / 程序执行效果 / ————

https://cdn.china-scratch.com/timg/180924/151601C50-7.gif

运行起来看着也没问题,请大家自动忽视CC哥的美工能力。https://cdn.china-scratch.com/Public/Home/images/grey.gif

———— /问题分析 / ————

但是CC哥觉得有问题:

第一个问题是,角色1和角色2分别处在不同的两个循环里,也就是两个循环是独立的,那么问题来了,对于赛道速度这个变量,角色1的循环里,每次循环都增加-5,角色2的循环里每次也增加-5。那相当于不是一次挪动了10步?明显把赛道运动速度加快了1倍。

第二个问题是,既然是两个独立的循环,如何保证两个循环能保持同步呢?尤其是如果把赛车在加上,把障碍物在加上,你会做出无数个独立循环,那程序在这么多循环里来回跳转,不但效率低,还很有可能因为每个循环中代码的长度不同,最后发生不能同步的情况。

所以说,大家看到的这种做法虽然很简单,但在设计这种需要多角色同步的游戏,是错误的。

https://cdn.china-scratch.com/timg/180924/15160160W-9.jpg

———— /正确做法 / ————

概念详解

广播...与广播...并等待的区别:广播是给所有的角色发布一条消息,其他角色接受到消息后触发一段代码。
广播...并等待,是发布消息后,并等所有角色接受到消息并执行完对应的代码后,才会执行下一条命令。虽然两个都会用来做多线程程序的同步作用,但是广播...是同步触发事件,而广播...并等待多用来多角色的连续操作的同步上,比如大家一起先去吃饭,吃完饭一起去看电影,看完电影一起去喝奶茶,喝完奶茶一起回家https://cdn.china-scratch.com/Public/Home/images/grey.gif

所正确的做法就是用广播并等待命令来统一所有角色的行动:

第一步:大家准备好-所有的角色初始化。

第二步:统一计算移动到哪个位置。

第三布:所有角色统一行动一步。

然后重复2~3步骤。

———— / 循环控制角色代码 / ————

https://cdn.china-scratch.com/timg/180924/1516015B1-11.jpg

主循环

https://cdn.china-scratch.com/timg/180924/1516023159-12.jpg

设置初始位置和移动速度

https://cdn.china-scratch.com/timg/180924/1516023M8-13.jpg

计算要移动到的位置

以上部分是循环控制角色的代码,我们创建一个透明的角色作为一个程序运行的整体控制。对于一些全局变量的运算,都可以放在这个角色里,便于阅读和管理。

———— / 角色1的代码 / ————

https://cdn.china-scratch.com/timg/180924/1516021J1-14.jpg

角色1收到消息后初始化自己和移动到统一算好的位置

———— / 角色2的代码 / ————

https://cdn.china-scratch.com/timg/180924/1516024312-15.jpg

角色2收到移动消息后根据统一计算出来的位置走到自己的位置

———— / 程序执行效果 / ————

https://cdn.china-scratch.com/timg/180924/1516033B7-16.gif

滚动的也很完美

———— /程序分析 / ————

大家看到没,这样做的好处是什么?

1:整个程序只有一个循环控制,计算机的开销小得多。

2:所有的角色完美的执行同步操作。

3:代码清晰易懂。

https://cdn.china-scratch.com/timg/180924/1516031R5-17.jpg

掌握了这种方法,大家还可以把赛车做进去,通过方向键来控制赛车,再加上之前的学过的碰撞,碰到路边后的汽车转向和减速操作,再把计数器加上等等,就可以比赛谁在最短的时间内跑的最远,一个完美的赛车游戏就做成了。

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com