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

 

 
posted @ 2023-03-31 16:58  以赛亚  阅读(33)  评论(0编辑  收藏  举报