Fight Aliens 碰撞检测 -- 实现子弹击中外星人
为了方便维护且,主文件中的代码会越来越多,做如下调整:
主文件main.py文件代码抽取出来封装成功能函数来实现,
1.目录结构如下:
2.子弹和外星人碰撞检测:
# 检查子弹和外星人是否发生碰撞, 即是否击中 def check_bullets_aliens_is_collided(gc, bullets, aliens): """ 检查子弹和外星人是否发生碰撞, 即是否击中 统计分数 :param gc: GameConfig 配置对象 :param bullets: 子弹合集 :param aliens: 外星人合集 :return: """ res = pygame.sprite.groupcollide(bullets, aliens, True, True) # res 返回的是一个 {} 发生碰撞就会有key value 可以用来统计分数 if res: gc.total_core += 1
3.外星人被消灭完后进入下一关卡【外星人移动速度加快】:
# 检查外星人是否全部被消灭,来判断是否进入下一个等级 def check_aliens_empty_is_to_next_level(screen, gc, aliens): """ 检查外星人是否全部被消灭,来判断是否进入下一个等级 :param screen: 屏幕对象 :param gc: GameConfig 配置实例对象 :param aliens: 外星人合集 :return: """ if len(aliens) == 0: # 外星人被全部杀死后进入下一关,并把外星人速度加快 gc.alien_speed += 1 gc.total_level += 1 create_aliens(screen, gc, aliens)
4. 飞船和外星人碰撞【飞船损失生命值,飞船子弹武力值增加】:
# 检查外星人是否入侵,如果入侵成功飞船要死 # pygame.sprite.spritecollideany(sprite, group) 有返回值 def check_ship_aliens_is_collided(screen, gc, ship, aliens): """ 检查外星人是否入侵,如果入侵成功飞船要死 :param screen: 屏幕对象 :param gc: GameConfig 配置对象 :param ship: 飞船对象 :param aliens: 外星人合集 :return: """ result = pygame.sprite.spritecollideany(ship, aliens) if result: # 如果result 有值,则证明发生来碰撞,生命减少 gc.ship_life -= 1 # 同时提高子弹的性能 gc.bullet_width += 0.5 # 子弹的宽度 gc.bullet_speed += 1 # 子弹的速度 gc.bullet_count += 1 # 限制子弹的数量 # 重制游戏,将外星人全部清除 aliens.empty() # 这里清空aliens 并不代表要进入下一关,而是重制当前关卡,需要重新创建外星人 create_aliens(screen, gc, aliens) else: # 另一种情况在没有发生碰撞才检测 就是外星人没有和飞船碰撞,但是已经出屏幕了也代表飞船生命值减少 for alien in aliens: if alien.rect.bottom >= screen.get_rect().bottom: gc.ship_life -= 1 # 重制游戏,将外星人全部清除 aliens.empty() # 这里清空aliens 并不代表要进入下一关,而是重制当前关卡,需要重新创建外星人 create_aliens(screen, gc, aliens) break