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中关于子弹设置的代码: