Scratch第73讲:火柴人射箭游戏

网友投稿 2019-12-03 11:34

我们有很多涉及到反射的游戏,这一款是CC哥比较喜欢的,就是小人之间有很多障碍物,需要我们射箭的时候计算发射角度,通过反射来射中目标。我们之前的反射游戏通常是碰到墙壁反射,或者一些垂直或水平的面进行反射,那么如果很多不规则形状该怎么反射呢?今天CC哥就用这个游戏让大家轻松的掌握任意角度的反射技巧。

让大家先看看CC哥编的小游戏:

是不是挺有意思的?

中间的障碍物和墙壁,以及每个面都可以进行反射,那是怎么计算反射角的呢?今天CC哥就重点讲这个部分:

游戏思路

1:先要确定反射面,象这个游戏里面,除了墙壁,障碍物每一个表面都需要能够反射。

2:做反射的第一个条件就是必须知道反射面的角度。

3:如何最简单的获取反射面的角度,最容易的方法就是每个反射面都是一个角色,这样你只要简单的获取角色的方面就好了。

4:技巧上你可以每个面用跟障碍物同色的细直线角色贴在障碍物的每个面上就可以了。

https://cdn.china-scratch.com/timg/191205/11340925E-0.jpg

所以大家看,中间的障碍物,其实就是三个直线角色拼接而成,当然如果你另外画一个同样的实心角色放在中间,那么就是实心的障碍物了。CC哥没费劲做是为了通过这种形式,让大家很容易理解编程的思路。

任意角度的反射角计算

https://cdn.china-scratch.com/timg/191205/1134103L8-1.jpg

假设的反射面就是y轴,那么反射角很容易,假设入射角是a,那么反射角就是0-a。就这么简单。如果反射面不是正好是竖直呢?假设反射面有一个方向角度呢?比如是B。那么我们该怎么办?现在是运用你想象力的时候了,可以想象一下我们只要把这个反射面竖直了!也就是反向旋转B度,那么不就又变成了竖直面反射了吗?好移动之后,入射角就变成了(a-B),那么反射角就是0-(a-B),然后我们再把反射面旋转回去,就是再正向旋转B,恢复到反射面的正常位置,那么反射角跟着一起旋转,真实的反射角就是:0-(a-B)+B=0-a+2B。这个就是通用的反射角计算公式啦。a代表入射角,B代表反射面的角度。

彻底的理解了这个,那么这一课的精髓你就算学完了。顺便看看程序吧:

箭矢的处理

https://cdn.china-scratch.com/timg/191205/1134103R3-2.jpg

看这只箭CC哥做的不错吧,很逼真。但是有一个问题大家注意到没有?这个箭是有长度的,箭尖碰到反射面,箭矢就要开始反弹转向,那么箭尾怎么处理?在转向过程中,箭尾也会碰到反射面的,整个箭矢是一个角色,角色碰撞,那不是又要再反射一次了?所以这里必须要有处理技巧。怎么做?引入影子角色!

https://cdn.china-scratch.com/timg/191205/113410J13-3.jpg

注意

CC哥发现有的朋友上来就从60讲以后开始学,但是实际编程水平还是很初级。所以CC哥劝这些朋友,还是要从第一讲开始学,学编程是一个过程,在前60讲里面有很多技巧的基础和概念,如果不能熟悉和很好的掌握,直接从后面学是很吃力的,事倍功半。

https://cdn.china-scratch.com/timg/191205/1134104235-4.jpg

这个影子角色,CC哥叫箭头,也就是一个小点,很小,平常是隐形的。所有的反射代码就编写在这个箭头里,而箭矢很简单,只要保持跟箭头方向一致,箭头的位置始终跟紧箭头就好。

https://cdn.china-scratch.com/timg/191205/11341035Y-5.jpg

https://cdn.china-scratch.com/timg/191205/1134102203-6.jpg

这段代码比较长,也是本程序的关键,其中用到的反射角计算公式就是文章上面刚讲过的。

另外,Scratch的侦测命令里有可以在任意角色里侦测其他角色的信息,非常方便编程。

https://cdn.china-scratch.com/timg/191205/1134114L3-7.jpg

就是这个,容易被忽略,通过下拉选项,你就可以知道其他任意角色的方向。

https://cdn.china-scratch.com/timg/191205/1134115N8-8.jpg

https://cdn.china-scratch.com/timg/191205/113411K36-9.jpg

舞台最下面灰色的部分定义的是地面,也是一个角色,箭头碰到就会停下来。

其实这个程序,CC哥觉得最花心思的还不是上面讲的这部分,而是射箭的动作部分。

https://cdn.china-scratch.com/timg/191205/1134112550-10.jpg

这个射箭动作有意思的有几点:

1:有拉弓搭箭的动作。

2:用鼠标可以控制弓箭瞄准的方向,而且小人的手臂也跟着弓在动。

处理技巧:

1:拉弓搭箭的关键是角色的位置和配合,因为箭和弓可不是一个角色,所以角色的位置配合要非常好。

2:另外为了保证手臂和弓能同时旋转,所以手臂跟弓是一个角色,造型放在了一起,而射箭小人是没有手臂的。

https://cdn.china-scratch.com/timg/191205/11341134a-11.jpg

https://cdn.china-scratch.com/timg/191205/1134123405-12.jpg

有没有觉得CC哥构思很巧妙,其实程序设计编程不是最复杂的,关键是构思,思路好,程序就简单,思路不好,那编程就会编的很复杂。

3:最大的难度是如何让弓和箭都绕着箭尾的点旋转。要知道,弓的中心点是旋转的圆心,非常好处理。但是箭矢的中心点是箭头,就不能简单的用旋转了,而是要根据弓旋转的角度,计算箭头的位置(影子角色)。这部分就需要用到三角函数了。大家可以画画图,然后计算一下,小朋友如果没有学过sin cos这些三角函数可以问问爸爸妈妈。

CC哥做了两种控制方法去做瞄准和发射动作,一种是空格配合上下箭头,一种就是用鼠标,CC哥更喜欢鼠标这种操作,鼠标按下-拉弓,鼠标上下移动来调整方向,鼠标松开-发射。

鼠标的控制,大家自己试的时候可以参考下面代码的逻辑。

https://cdn.china-scratch.com/timg/191205/1134121D7-13.jpg

--end--

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