美文网首页
【python3小白上路系列】射杀敌人!

【python3小白上路系列】射杀敌人!

作者: Charles_DT | 来源:发表于2020-08-25 10:57 被阅读0次

昨天我们已经实现了一群敌人的移动,如果你运行成功的话,会发现子弹会穿过敌人,因为我们没有检测碰撞。今天来实现射杀敌人的功能吧~

2.5 射杀敌人

要让子弹能够击落外星人,我 们将使用sprite.groupcollide() 检测两个编组的成员之间的碰撞。

2.5.1 检测子弹与敌人的碰撞

子弹击中敌人时,我们要马上知道,以便碰撞发生后让敌人立即消失。为此,我们将在更新子弹的位置后立即检测碰撞。方法sprite.groupcollide() 将每颗子弹的rect 同每个敌人的rect 进行比较,并返回一个字典,其中包含发生了碰撞的子弹和敌人。在这个字典中,每个键都是一颗子弹,而相应的值都是被击中的敌人(实现记分系统时,也会用到这个字典)。

在函数update_bullets() 中,使用下面的代码来检查碰撞:

def update_bullets(bullets):
    # 更新子弹的位置
    bullets.update()   # 删除已消失的子弹
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)
    # 检查是否有子弹击中了敌人
    # 如果是这样,就删除相应的子弹和敌人
    collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)

新增的这行代码遍历编组bullets 中的每颗子弹,再遍历编组aliens中的每个敌人。每当有子弹和敌人的rect 重叠时,groupcollide() 就在它返回的字典中添加一个键-值对。两个实参True 告诉Pygame删除发生碰撞的子弹和敌人。(要模拟能够穿行到屏幕顶端的高能子弹——消灭它击中的每个敌人,可将第一个布尔实参设置为False ,并让第二个布尔实参为True 。这样被击中的敌人将消失,但所有的子弹都始终有效,直到抵达屏幕顶端后消失。) 我们调用update_bullets() 时,传递了实参aliens :

    while True:
        gf.check_events(ai_settings,screen,ship,bullets)
        ship.update()
        gf.update_bullets(aliens,bullets)
        gf.update_aliens(ai_settings,aliens)
        gf.update_screen(ai_settings,screen,ship,aliens,bullets)

现在运行游戏,便可以射杀敌人了,然而敌人全部消失后,我们需要增加新的敌人,下面我们来实现更新新的敌人。

2.5.2 更新新的敌人

要在敌人群被消灭后又显示一群敌人,首先需要检查编组aliens 是否为空。如果为空,就调用create_fleet() 。我们将在update_bullets() 中执行这种检查,因为敌人都是在这里被消灭的:

def update_bullets(ai_settings,screen,ship,aliens,bullets):
    # 更新子弹的位置
    bullets.update()   # 删除已消失的子弹
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)
    # 检查是否有子弹击中了敌人
    # 如果是这样,就删除相应的子弹和敌人
    collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)

    if len(aliens) == 0:
        # 删除现有子弹并新建一群敌人
        bullets.empty()
        create_fleet(ai_settings,screen,ship,aliens)

记得更新主程序中的update_bullets函数:

    while True:
        gf.check_events(ai_settings,screen,ship,bullets)
        ship.update()
        gf.update_bullets(ai_settings,screen,ship,aliens,bullets)
        gf.update_aliens(ai_settings,aliens)
        gf.update_screen(ai_settings,screen,ship,aliens,bullets)
2.5.3 提高子弹的速度

我们发现子弹穿梭的速度有点缓慢,调整子弹速度值到正常水平:

#子弹设置
        self.bullet_speed_factor = 3
        self.bullet_width = 3
        self.bullet_height = 15
        self.bullet_color = 60,60,60
        self.bullets_allowed = 3

这里我调成了3,不同电脑的速度值有差别,需要根据不同的电脑来设定。

2.5.4 重构update_bullets()

下面来重构update_bullets() ,使其不再完成那么多任务。我们将把处理子弹和敌人碰撞的代码移到一个独立的函数中:

def update_bullets(ai_settings,screen,ship,aliens,bullets):
    # 更新子弹的位置
    bullets.update()   # 删除已消失的子弹
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)
    # 检查是否有子弹击中了敌人
    # 如果是这样,就删除相应的子弹和敌人
    check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets)

def check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets):
    collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)

    if len(aliens) == 0:
        # 删除现有子弹并新建一群敌人
        bullets.empty()
        create_fleet(ai_settings,screen,ship,aliens)

OK,现在来测试一下吧。下一节我们要增加结束游戏的功能。越来越完整了,加油!

相关文章

网友评论

      本文标题:【python3小白上路系列】射杀敌人!

      本文链接:https://www.haomeiwen.com/subject/fseajktx.html