Scratch第72讲:精确制导
想了解编程技巧,就请点击上面蓝字:跟我学Scratch编程,关注CC哥
本来想在飞机大战的游戏里加入导弹,后来想了一下,CC哥的目的主要还是做教学,所以为了让大家更好的学习和掌握知识,CC哥就把这个精确制导做成了独立的游戏,让大家更容易学习。
导弹的特点
导弹嘛,CC哥总结的特点就是:
1:自动选择目标
2:自动追踪目标,而且运动轨迹是弧形的。
在你的游戏里加入导弹是不是给游戏增色很多,有思考怎么实现的吗?让我们一起来看看。
游戏关键点
导弹也好,敌机也好,如果都是本地的角色之间发生互动关系,都不会复杂,但是这个游戏的关键是两个角色克隆体之间的互动,因为发射出去的导弹是导弹角色的克隆体,敌机是敌机角色的克隆体,那么克隆体之间怎么进行这种实时的互动呢?
程序介绍
战机没啥好介绍的,控制部分跟飞机大战都一样,用上下左右键进行移动。关键是让大家看看CC哥找的造型是不是很酷
敌机的造型也挺酷的
导弹如何选择目标
如果想让导弹选择目标,那么就必须要有一个可选择的记录库,和选择的标准,所以,当导弹发射的一瞬间,我们需要知道天上有多少敌机,以及他们之间怎么区别的,只有具备这些条件,你才有选择的基础。所以为了选择目标,CC哥创建了一个列表,这个列表里就包含了所有在天空中出现的敌机。只要在这个列表里进行选择就好了。
那这个列表里存的什么数据呢?存的就是一个一个敌机的编号。所以我们在克隆敌机的时候,需要为每一个敌机进行编号,否则就无法对敌机进行一一的识别,更谈不上选择了。
这是敌机开始的一段程序,CC哥让敌机在舞台的高处随机的出现,但是在出现的同时,用“敌机编号”这个私有变量对敌机进行编号。同时把这个敌机编号加入到{敌机队列}这个列表里。
但是如果敌机消失在舞台边缘,或者被击毁和撞毁,那么它就不再是目标了,就需要从目标的库里删除掉,也就是从{敌机队列}里删除掉。
这段代码不难理解,就是敌机在飞行过程中,如果被导弹击中,就播放爆炸效果。然后不论是那种情况消失,都需要从敌机队列里删除这个编号。删除完之后,如果队列里还有敌机,那么就选择队列的第一项,也是队列里出现最早的飞机。如果删除完之后队列里没有项目了,就说明飞机已经被打光了,所以要把目标敌机这个变量设为0。
CC哥用“目标敌机”这个变量来代表此时此刻被导弹锁定的敌机!
如果目标敌机为0了,也就是没有敌机了,那么下面一刻新克隆出来的敌机就自动成为当前的目标敌机。
当然,既然知道了目标敌机是谁,那肯定无时不刻都要盯紧它,要实时锁定它的物理方位才能进行攻击!
导弹飞行过程中跟踪敌机
敌机的坐标锁定了,但是导弹怎么跟踪它呢?这个x和y坐标可是随时在发生变化,而不是固定在那里让我打。那你的运动轨迹如何跟踪一个实时变动的目标呢?
一种方法:根据双方的X和Y坐标来算角度,这就是几何了,大家可以画画图试一下怎么计算,CC哥认为这也是一种不错的方法呢。
还有一种方法就是用现有的命令,
但是问题是这只能面向一个角色,不能面向一个克隆体呀,怎么办?老办法,引入影子目标角色,也就是用另一个隐形的角色,实时的移动到目标的X,Y坐标上,充当靶子。只要导弹面向这个角色,就相当于面向了目标,只要实时去用面向这个命令来校准,那导弹就始终是往目标的地方追。
这就是这个影子角色,为什么不随便用个圆圈或小点代替,是因为CC哥要做碰撞检测的,所以只有影子目标的造型和真实目标的造型一模一样,才能完美的检测是否真正击中目标。另外CC哥涂这一下子是为了调试程序用的,否则都长一样,CC哥也区分不出哪个是真身哪个是影子呀。
为什么不用隐藏,而用虚像99,这两个的基本效果都是一样的,都是让你看不见,但是区别是隐藏了就检测不到碰撞了,而虚到99,那虽然你看不见,但是计算机看得见,也就是碰撞检测不受影响。对于这段程序就是目标角色会始终盯住目标战机的位置,任劳任怨的充当导弹的靶子。
飞机上不同的位置开始着火,就能充分表现这一点,后来加上去发现效果还不错。
如果想免费获得CC哥的讲座中的程序代码以及游戏素材,可以通过扫描二维码关注《跟我学Scratch编程》,然后点击获取代码即可。
游戏合理性
CC哥做程序和游戏都有一个习惯,要思考你设计的东西是不是合理,在目标选择这一块,CC哥就想了,按照上面的逻辑,肯定是选择最早出现的敌机,因为离得的会最近,最有威胁。但是如果用导弹去作为攻击武器,那么就不那么简单了,因为导弹有导弹的特性,首先导弹都是往前发射,发射出去之后再变化轨迹进行敌机追踪,第二,导弹是飞的很快的,并不会临时转弯,转弯时需要较大的转弯半径。所以不是所有的敌机都适合发射导弹去攻击。比如已经靠近你左右侧的敌机就很难击中,因为转弯半径就已经大过与敌机的距离了。或者已经飞到你后面的敌机就更难击中一些。当然,放着前面的敌机不去打,非要辛苦的绕到后面去打,肯定不合理。
所以CC哥为了合理性,就在目标选择上增加了筛选条件,也就是只有在战机前面并和战机保持一定距离以上的敌机才会成为攻击目标。
处于这份考量,CC哥在目标跟踪上加了这段代码,如果在发射时检测到敌机离战机太近和位于战机的后方,那么目标会忽略次敌机,自动调整到下一个可以攻击的敌机。
导弹的运动轨迹
导弹的运动轨迹也是个游戏设计点:
有点象火箭的导弹
这个就是如果锁定了目标就发射!发射的初始方向都是正前方!
然后根据目标的位置进行方向修正,如果导弹的方向和飞机飞行的方向差别比较大时,那么每飞一步就进行5度的校准,如果方向差别已经在5度以内了,那么校准就变成每步1度。
这段代码比较长的原因是校准的方向跟导弹和敌机所处的位置有所区别,举个例子,如果导弹和敌机都在垂直方向的一边,那么轨迹比较简单,始终朝着减小的方向调整就能将两个角度重合。但是如果一旦出现其中一个角色飞到了下部中心垂直方向的另一边,那么两者之间的角度差就会突然大了180度。这时候你如果还是朝着角度差减小的方向去调整,那么可能会造成导弹的突然转向,从另一个方向去追敌机,那肯定是不合理的,这跟Scratch的坐标和方向的定义有很大关系。所以CC哥在这里做的条件判断,就是不希望导弹会随着角色突然跨越下部中心垂直线造成方向角度的突然变化而导致导弹突然转向。
总结
今天学到的知识:
1:用列表来存储克隆体的编号,从而实现对克隆体的个体管理。
2:用影子角色来辅助对具体某个克隆体的操作。
3:进一步了解位置,方向的相对性。
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com