最新消息:

Scratch— 看上去很简单的反弹球

Scratch 少儿编程 3542浏览 0评论

友情提示:视频教程观看时请手动设置清晰度。

先看一段视频:

是不是看起来很简单?球从高处落下,碰到地板后反弹,类似我们之前学过的“碰到边缘反弹”的效果。但是,很多简单的事情做起来却是不那么简单,让我们一起来看看里面有多少个“坑”在等着我们。

一、小球落下不能是匀速下降。

小球下降不能是简单的使用“面向180度”+“移动1步”之类的指令实现,下降必须符合重力加速度的物理规律,即每一次的位移距离=速度 * 时间,表现出来就是随着时间的增加,下降的距离越来越大,看起来就像是越来越快,而反弹的效果是随着时间的增加,反弹看起来越来越慢。如何实现呢?

Scratch--- 看上去很简单的反弹球

循环的时候,每一次循环都将下降速度增加-1,随着循环次数的增加(即时间增加),下降速度的绝对值越来越大,这样就有加速度的效果了。

二、球碰到地板后,居然穿透了地板!

Scratch--- 看上去很简单的反弹球

为什么会这样呢?因为小球下降的时候,每一次移动的距离会越来越大(加速效果),在小球碰到地板前的最后一步时,它即将移动的距离已经超过了小球和地板之间的距离,从而导致在碰到地板时,一部分小球的实体越过了地板。

有什么办法避免这种情况呢?我看到有人介绍他是这样处理的:加一段程序,如果小球碰到了地板那么就执行一个循环,在每一步下落时都判断是否碰到地板,如果碰到地板后就后退,后退完毕后又增加了一条语句,让小球再下降一步,保证小球和地板接触上,这样让小球回到地板上方。这是一种错误补偿机制,不过这种方法相对小朋友来说,可能理解上会有点困难。

我的解决方案是:小球下降移动前,先计算下一次即将出现的位置的Y坐标,并判断下一位置是否穿过了地板,如果是,则限制小球的下一位置就是地板所在位置,否则正常移动。这里也会存在一个小陷阱:即使小球的位置坐标等于地板的位置坐标,还是会出现穿透效果!这时,需要将小球造型的原点坐标设置成小球的最低点!

Scratch--- 看上去很简单的反弹球

三、反弹后,再次下降的时候,还没碰到地板就反弹了。

Scratch--- 看上去很简单的反弹球

这是因为最后一次下降移动到地板位置时,移动的效果还没有展现出来,系统就已经计算、判断并开始执行反弹指令了。我们仅仅只要在执行反弹前增加一条指令:等待0.01秒就可以解决这个问题了。

四、反弹的时候,总是反弹到出发点,没有反弹衰减的效果。

Scratch--- 看上去很简单的反弹球

这是因为每次反弹之前没有降低反弹的初速,很简单,只需要在每次反弹之前将速度加1。(下降的时候速度是负值,反弹的时候,速度是不断的+1

五、球反弹衰减至最后,突然上升冲出了屏幕。

Scratch--- 看上去很简单的反弹球

这是因为在最后小球碰到地板,且速度降为零的时候,此时应该静止下来,但因为没有做判断控制,小球反弹的速度继续增加已经由负值转为正值,并且进入反弹处理程序模块,所以小球就直接向上加速飞去了。所以我们要加个判断,当反弹的初始速度为零时,程序结束。

下面是我的程序,大家可以试一下:

Scratch--- 看上去很简单的反弹球

Scratch--- 看上去很简单的反弹球

Scratch--- 看上去很简单的反弹球

成功的路有千万条,大家也不要局限于我的思路哦,有好的方法,也希望你能共享出来。

您必须 登录 才能发表评论!