Scratch第四十七讲:台球(多一个台球)
想了解编程技巧,就请点击上面蓝字:跟我学Scratch编程,关注CC哥
首先祝大家五一节快乐哦,想必大家都出去玩了,CC哥在家继续给大家讲Scratch。
今天还继续讲台球,台球这个游戏其实CC哥想了很久的,这个游戏说简单了其实就是一个碰撞,但是如果我们上网看看,通常没什么用scratch做的比较好的台球游戏,为什么呢?因为复杂。大家大多数看的都是一个球的台球游戏,很少见到两个球,为什么呢?因为球和球之间会碰撞。一旦碰撞就会发生路径的变化,在一个球台里如果有多个球,那么相互之间的碰撞就会变得非常复杂。你怎么处理呢?想想就会头疼。今天CC哥就来尝试在台球桌上放两个球。游戏还是在上一讲的基础来做。
这个台球有意思没有,CC哥为了把球打进洞,自己还练习了挺长时间,还真是有点不容易。
下面讲讲这个程序,这个程序在球台上增加了一个球,游戏的目的是用白球击打这个蓝球,把球打进洞。
程序的难点是,当白球击打到蓝球的时候,这两个球的运动轨迹会发生什么变化。如果想让运动轨迹符合实际,那么就要用点物理的知识了。如果白球正好击打到蓝球的球心,那么白球的动能应该全部传递给蓝球,而白球就要静止下来。如果白球没有打到球心,那么蓝色的球和白色的球会分别弹向不同的方向,并且各自的速度也不一样。那怎么计算呢?
看一下这个图,当下面的球撞到上面的球的时候,会有这四个关系:
上面的球会往v2的方向走,下面的球会往v1的方向走;
v1和v2的角度是垂直的;
v2的方向是沿着两个球心的连线;
v1²+v2²=v²
有了这个撞击的规则,大家知道两个球碰撞的程序怎么设计了吗?
注意,这里只是一个球撞击另一个静止的球的做法,所以我们今天做的程序只是设计了白球去撞击静止的蓝球,如果撞击之后两个球都在运动中发生的碰撞,CC哥今天没做。大家也可以看看如果两个球同在运动中的时候,如果发生碰撞,路径和速度的算法应该如何。
程序讲解
首先增加了一个角色,就是蓝球,ball2。
这个蓝球的程序CC哥就是用角色的运动来处理了,而不是再象白球那样用画笔来画了。也是为了处理简便。白球的程序基本没变,大家可以参考上一讲。
今天重点讲的是蓝球的程序。
这段程序有几个部分:
1:检测颜色来检测是否发生两球的撞击。
2:如果发生碰撞就先检测蓝球在碰撞后的方向。
当两个球发生碰撞时,先让蓝球面对白球,这时候就是蓝球面对白球的球心。那么蓝球下一步要弹开的方向,就是两个球心连线相反的方向。同时用faceballangle记录下来蓝球下一步要走的方向。
3:算出蓝球和白球弹开的初始速度。
这个可以用刚才讲的原理来算出来。
蓝球的速度speed2=白球的速度Dist * cos(白球原始方向与两个球心连线之间的夹角)
白球的速度dist=白球的速度disi * sin(白球原始方向与两个球心连线之间的夹角)
4:算出白球的方向。
这个要做一个判断,要看白球是偏左撞击,还是偏右侧撞击,如果偏左侧,那么白球会往左弹,如果偏右侧,那么白球会向右弹。取决于白球原先行进方向的角度,和蓝球下一步要弹开的方向角度之间的相互关系。白球弹开的方向是和蓝球运动方向垂直的。
5:蓝球的运动轨迹
白球有白球的运动程序,所以只要确定了撞击之后的速度,和方向,那么运动的部分就不用做了,因为上一个程序已经做了。这里就只需要做蓝球的运动轨迹程序就行了。
speed2是蓝球的初始速度,每步减少0.05,代表了速度越来越慢,之所以写0.05,是跟白球的运动同步,让大家在减速的步调是一致的。
蓝球在撞到边框一样会发生反弹。这里跟白球一样,我做了一个自定义的积木,用来处理蓝球跟边框碰着后所发生的方向改变。
6:蓝球碰到边框的程序
这个部分跟上一个白球的碰撞检测差不多,这里就不重复讲了。碰到边上之后的移动speed2步的命令,其实是让蓝球离开四个台边。
球进洞的程序:
球是要打到洞里的,那么我们看看蓝球进洞是什么程序控制。
这个进洞检测跟白球的进洞检测是一样的。进洞的效果就是消失后在球台的正中间再次出现。这里就不讲了。
今天的讲解没有做太多内容,重点就是两个球碰撞之后的速度和方向的计算方法。大家掌握了这个技巧,以后做碰撞的游戏肯定会生动很多。
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com