射杀外星人python实验_【python3小白上路系列】射杀敌人!

本文介绍了如何在游戏开发中实现子弹与敌人的碰撞检测,通过`pygame.sprite.groupcollide()`函数来判断并处理碰撞,删除被击中的敌人。同时,当所有敌人被消灭后,介绍了如何更新生成新的敌人,保持游戏进行。此外,还调整了子弹速度以提升游戏体验,并重构了`update_bullets()`函数,使其更专注。最后,游戏增加了结束条件的预告。
摘要由CSDN通过智能技术生成

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

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,现在来测试一下吧。下一节我们要增加结束游戏的功能。越来越完整了,加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值