飞机大战优化续篇4:实现背景滑动、BOSS敌机功能、胜利结束画面的功能

好像挺久没更新优化续篇了,其实是过了一个劳动节,节后又开始继续功能深挖。
5月5日,劳动节放假最后一天,应邀见了梁博与门博,并在梁博的写字楼空间里面参加了下他们公司的基本情况。
门博从中撮合,感觉梁博想招揽我过去他们团队的感觉,不急,再等等看。
节后初步想法是,将目前的游戏版本向“关卡制”的方式进行探索,那么就涉及了几个需要考虑与待解决的问题:
1、游戏画面最好修改为滚轴滑动的方式;
2、敌机BOSS在什么时机入场,我觉得按惯例是游戏背景图片滑动到顶端后,背景图片不动的时候;
3、敌机BOSS入场后,是静止的,还是动态的?
4、敌机BOSS的子弹系统设计的合理性,应该考虑可以逼迫我方飞机到处闪躲,并且避免明显的子弹真空地带;
5、敌方BOSS被消灭后,不再调用GAME OVER画面,而转而调用VICTORY画面;
6、VICTROY画面里面,是否有下一关的按钮,如果有下一关,如何调用?
… …
5月6日,初步探索了一下,解决了上面的第一个问题,即实现了背景图片的滚动效果,并可根据是实战,还是调试阶段,而自由设置滚动速度(滚动速度的快慢决定了遇见BOSS的快慢)。
5月7日,解决了上面的第二、第三、第四、第五个问题。关键点总结如下:
敌机BOSS目前设置为,在背景图片background.png的左上角滑动到(0,0)时触发BOSS敌机出现的(添加了一个boss_appear的判断开关进行控制)。
敌机BOSS入场后,当MOVE到50像素时,不再移动,保持静止状态,开始发射子弹。
子弹分为直行子弹与散弹两种,发射频率不一样,可以由此控制游戏的难易程度。
敌机BOSS在被消灭后,遇到几种异常情况:

1
2
3
4
5
6
7
8
9
10
第一种情况:
最开始,是将VICTORY画面放在敌机BOSS毁灭的LOOP里面的,导致的结果是:
消灭BOOS后,游戏画面并不会停止,也不调用VICTORY画面,而是不停的显示爆炸画面与爆炸音效,飞机也可以继续发射子弹。
第二种情况:
在遇到第一情况后,就将VICTORY画面的调用行为放在与GAME OVER画面调用行为并行的位置处,进入LOOP的条件为判断敌机BOSS是否挂掉(if boss.active == False)。导致的结果是:
消灭BOSS后,游戏画面顺利停止,会调用VICTORY画面,但是可以从游戏画面看到,游戏并未进入敌机BOSS爆炸绘制的LOOP,就直接调用了VICTORY画面。
原因分析:
敌机BOSS的active初始值为True,根据boss.active能进入敌机BOSS的绘制与子弹装入弹夹功能。
当我方子弹进行碰撞测试时,如果我方子弹与敌机BOSS发生了碰撞,并且boss.blood == 0时,设置了boss.active = False。
此时boss.active为False将让程序在下一帧运行时,直接跳过主程序LOOP: if not pause and LIFE_NUM and boss.active:,直接进入了VICTORY画面的调用,于是敌机BOSS的爆炸画面无法执行。

解决办法:
引入新的判断开关use_victory_screen,默认时为False。
将主程序LOOP的跳入条件进行修改,变更为:if not pause and LIFE_NUM and use_victory_screen == False:
然后在敌机BOSS的爆炸事件完成后,设置use_victory_screen = True,直接在主程序LOOP转向,调用VICTORY画面。

接下来,将考虑在VICTORY画面添加进入下一个关卡的控制按钮,并探索关卡制的跳转原理。

实现后的游戏画面如下: