Python项目实践之二:外星人(2)

Python项目实践之二:外星人

接着上篇文章继续写。。。

一、射杀外星人

我们创建了飞船和外星人群,但子弹击中外星人时,将穿过外星人,因为我们还没有检查碰撞。在游戏编程中,碰撞指的是游戏元素重叠在一起。要让子弹能够击落外星人,我们将使用sprite.groupcollide() 检测两个编组的成员之间的碰撞。

1、检测子弹与外星人的碰撞

sprite.groupcollide() 函数:检测两个编组成员之间的碰撞,因此,我们只需要检测子弹编组和外星人群编组是否发生碰撞即可。
修改game_functions.py中的update_bullets()方法:

def update_bullets(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)

解释:
1、此方法是用于实时更新子弹位置,因此把检测子弹和外星人群碰撞的方法放到这里在合适不过了,当然,你也可以把检测碰撞的方法放到实时更新外星人群的方法update_aliens()中去,效果是一样的。
2、sprite.groupcollide() 函数:新增的这行代码遍历编组 bullets 中的每颗子弹,再遍历编组 aliens 中的每个外星人。每当有子弹和外星人的 rect 重叠时, groupcollide() 就在它返回的字典中添加一个键值对。两个实参True 告诉Pygame删除发生碰撞的子弹和外星人。(第一个布尔值设置为false,子弹将不会被删除,直接飞出屏幕)。

我们给update_bullets()方法添加了一个新的参数,所以相应的的主函数alien_invasion.py调用到此方法的地方也要修改一下:

#调用管理子弹的函数
gf.update_bullets(aliens, bullets)
2、生成新的外星人群

这个游戏的一个重要特点是外星人无穷无尽,一个外星人群被消灭后,又会出现一群外星人。

要在外星人群被消灭后又显示一群外星人,首先需要检查编组 aliens 是否为空。如果为空,就调用 create_fleet() 。我们将在 update_bullets() 中执行这种检查,因为外星人都是在这里被消灭的,修改game_functions.py中的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()方法添加了新的参数,所以相应的的主函数alien_invasion.py调用到此方法的地方也要修改一下:

		#调用管理子弹的函数
        gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
3、为测试添加创建大子弹

目前,已经能实现外星人被全部击落后又重新创建新的外星人群,为了测试这个功能是否正常,我们需要运行游戏后把所有外星人都击落,然后观察是否会创建新的外星人群,但是这着实也太繁琐了,浪费了很多不必要的时间。

为此,我们就要考虑通过什么方式来测试程序能高效而简洁,测试有些功能时,可以修改游戏的某些设置,以便专注于游戏的特定方面。例如,可以缩小屏幕以减少需要击落的外星人数量,也可以提高子弹的速度,以便能够在单位时间内发射大量子弹。测试这个游戏时,可以做的一项修改是增大子弹的尺寸,使其在击中外星人后依然有效。

4、提高子弹的速度

如果你现在尝试在这个游戏中射杀外星人,可能发现子弹的速度比以前慢,这是因为在每次循 环 中 , Pygame 需 要 做 的 工 作 更 多 了 。 为 提 高 子 弹 的 速 度 , 可 调 整 settings.py 中bullet_speed_factor 的值。
settings.py中关于子弹设置的代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值