🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 击落敌舰 子弹击中敌舰,我们可以使用 `pygame.sprite.groupcollide`方法来检测。我们向Main.py文件的按键控制区下增加代码: ``` # 子弹击毁敌舰 bullet_collide_dic = pygame.sprite.groupcollide(bullet_sprites, enemy_sprites, True, True) for bullet in bullet_collide_dic: print(bullet, bullet_collide_dic[bullet]) ``` ## 敌舰撞机 在游戏开始的时候,我们需要让plane位于screen的底部: ``` # 飞机位于舞台底部 self.rect.x = self.bg_size[0] / 2 self.rect.y = self.bg_size[1] - self.rect.height ``` 敌舰装机和子弹击毁敌舰类似,我们在Main.py里增加代码 ``` if pygame.sprite.spritecollideany(plane, enemy_sprites) is not None: print('killed') running = False ``` 当飞机被击落后,游戏就结束了。因此,我们把 running 设置为False。此时游戏效果如下: ![](https://adatech-1256165843.cos.ap-chengdu.myqcloud.com/20181022073214.png) ## 批量化出现敌舰 到目前为止,敌舰被撞击后就都没了。我们需要让敌舰减少一定数量后就再增加一些敌舰。 首先,我们把初始化敌舰的代码改为一个函数: ``` def init_enemy(size): for i in range(size): enemy = Enemy((random.randrange(0, WIDTH), random.randrange(0, 50))) enemy_sprites.add(enemy) all_sprites.add(enemy) # 初始化敌舰 init_enemy(ENEMY_SIZE) ``` 在子弹击毁敌舰后,我们判断敌舰数量是否小于min_size,如果小于这个数字,就再初始化一次敌舰: ``` # 增加敌舰 if len(enemy_sprites) <= ENEMY_MIN_SIZE: init_enemy(ENEMY_SIZE - len(enemy_sprites)) ``` 此时,游戏效果如下: ![](https://adatech-1256165843.cos.ap-chengdu.myqcloud.com/20181022073309.png) ## 碰撞检测总结 在sprite里,有三个碰撞检测方法:`pygame.sprite.groupcollide(bullet_sprites, enemy_sprites, True, True)` 两个group是否发生碰撞;`pygame.sprite.spritecollideany(plane, enemy_sprites)` 一个sprite是否碰到一个group里的任何一个sprite;`pygame.sprite.spritecollide(plane,enemy_sprites,True)`获取一个plane碰到group里的所有sprite。 可以发现,经过pygame的封装。碰撞检测变得非常简单。在我们的游戏开发里,非经常用到各种各样的角色碰撞。这是游戏的核心。 下节课,我们来记录一下游戏的得分,并给我们的飞机和敌舰增加些生命值,让游戏更好玩。