万事俱备,只欠子弹和外星人同归于尽……
我们将使用sprite.groupcollide()来检测子弹和外星人的碰撞,也就是查看二者是否重叠在一起~~
在game_functions.py中的update_bullets(bullets,aliens)方法内加入一行代码:
collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)
对,就这么一行,完美解决碰撞问题,话说现在这接口也太实用了吧……四个参数,前两个为子弹和外星人编组,该方法将遍历二者,参数True告诉pygame删除发生碰撞的子弹和外星人,也就是同归于尽。。如果想设计超级子弹,即一颗子弹消灭多个敌人(抗日神剧中经常性地上演),那可以降低一格True改成False,即发生碰撞后不删除子弹只删除外星人。。对了,该方法将返回一个字典,存储在collisions中,包含了发生碰撞的子弹和外星人,其中前者是键,后者是对应的值。
在主程序中调用
update_bullets(bullets,aliens):
gf.update_bullets(bullets,aliens)
这个时候运行游戏便能开始实物射击了:
还可以设计大号子弹,增大威力,在settings.py中更改子弹宽度:
self.bullet_width=100
这时:
现在还要做的就是将当前外星人全部消灭后添加新的外星人群,由于之后对代码进行了重构后,直接上最终效果吧:
def update_bullets(ai_settings,screen,ship,bullets,aliens):
bullets.update() #将为组bullets中的每一颗子弹调用bullets.update()
#删除已经消失的子弹
for bullet in bullets.copy(): #遍历编组的副本,这样不会删除列表中的条目
if bullet.rect.bottom<=0:
bullets.remove(bullet)
check_collisions(ai_settings,screen,ship,bullets,aliens)
#print(len(bullets)) #显示当前还有多少子弹
def check_collisions(ai_settings,screen,ship,bullets,aliens):
collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)
print(collisions) #打印字典
if len(aliens)==0: #判空
bullets.empty() #清空当前子弹
creat_aliens(ai_settings,screen,aliens,ship) #创建新的外星人群
这是game_functions.py中的两个方法,在第一个方法中调用第二个方法,后者主要实现检查处理碰撞,当外星人被消灭完后再创建新的外星人群,正常情况下应该先清理掉当前屏幕中的子弹再创建新的外星人,还有就是打印字典,前边提到过,这个字典中装的是已被消灭的子弹和外星人的键值对,单打印出来是这个样子的:
如果把打印语句放到if语句中,即消灭一波外星人后再打印,效果是:
我本以为是多个键值对。。这样看来他们都在0组中。。后面还会用到字典,继续探究……
最后别忘了在主程序中调用更改后的方法~~主要就是参数的变化……