Pygame实战之外星人入侵NO.9——消灭外星人

万事俱备,只欠子弹和外星人同归于尽……
我们将使用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组中。。后面还会用到字典,继续探究……

最后别忘了在主程序中调用更改后的方法~~主要就是参数的变化……

猜你喜欢

转载自blog.csdn.net/u014483914/article/details/80373140