飞机大战优化续篇2:敌方大飞机子弹方案完美版本

从上一篇实现敌方飞机增加子弹效果的博文,到现在刚好过去了两天。
上一篇写到,已经完美的解决了敌方飞机添加子弹的功能,结果在这两天进一步优化时,发现了太多太多的逻辑陷阱,实际效果也差强人意,代码修改了一版又一版,都出现各种各样的问题。曾经有两个版本从画面的呈现上看,似乎找到了解决版本,但是都经不过深入推敲:要么在暂停到一帧页面时,发现了重影的迹象,要么在修改局部参数时,结果让人大跌眼镜。两天时间,苦思不得其解。现在回首,当时说的完美解决,简直是贻笑大方。
今天下午四五点的时候(现在已是凌晨,讲究的说法,是昨天下午^_^),经过在沙发上静静的思索从第一帧的出现,到120帧的出现,到底应该是怎么样的实例出现逻辑,正好在谷歌上看到某个人回答其他人问题的一句话“可以在sprite类实例生成时,自动添加到某指定名称的sprite.Group()中”,这句话一下激发了自己的灵感,马上起身在bullet类文件里面把Bullet_Enemy类的启动语句按刚才那位网友的说法进行的修改,结果…,并没有什么卵用,运行失败。
虽然这条路没走通,但他说的在生成时加入组的这个说法让我思路一下打开了,于是到main文件中,找到if not(delay 120):这个延时控制的loop,原本里面是一个控制bullet_enemy列表的索引跳转的功能,然后通过读取索引对应的列表中装的子弹实例进行绘制,但是总是调测不到正常的状态。现在我把之前通过临时列表来控制bullet_enemy列表索引的方法全部废除,直接在loop中,往enemybullet这个sprite.Group()(该精灵组需在最开始做实例化操作)通过.add()的方式添加带有当前飞机位置信息、速度信息的sprite类实例(5颗新实例化的子弹,位置参数为飞机的5个坐标值,速度参数通过getX与getY传递给类文件进行初始化)。然后,相当于每过120帧都会跳进这个LOOP来新生成5颗最新位置的子弹。然后子弹进行移动、绘制。只是需要注意:1、子弹飞出屏幕范围后,要及时设置其active属性为False,这样CPU将不再继续绘制;2、子弹的母体(敌方飞机)被我方飞机撞爆炸,或者被我方子弹撞爆炸后,敌方飞机的ACTIVE会设置为False,但是并不影响已经射出的敌方子弹继续按轨迹进行飞行,直到飞出屏幕范围,才不再绘制。
至此,我可以负责任的说,敌方飞机子弹的功能现在是真的完美解决了,逻辑链条清晰而简单,并且适合变种应用。
比如,晚上我化了很短的时候,只是调整了生成子弹时,子弹的位置参数,与速度参数(Xspeed、Yspeed),就顺利实现了敌方飞机的散弹功能(见附图)。
好了,该睡觉了,晚安,祝大家五一劳动节快乐!