《Alien Invasion》外星人掉落powerup触发AttributeError错误问题
问题修复方案
错误原因
pygame.sprite.groupcollide() 返回的碰撞结果collisions是字典结构:
- 键是命中目标的子弹对象
- 值是被该子弹击中的所有外星人组成的列表
你原来的代码里,for aliens in collisions.values()循环结束后,aliens变量是列表类型,自然没有rect属性,才会触发报错。
修复代码
你只需要修改_check_bullet_alien_collisions方法里的掉落逻辑即可,改为遍历每个被击中的外星人,单独判断是否掉落道具:
def _check_bullet_alien_collisions(self): """响应子弹和外星人的碰撞""" collisions = pygame.sprite.groupcollide( self.bullets, self.aliens, True, True ) if collisions: # 遍历所有被击中的外星人列表 for alien_list in collisions.values(): self.stats.score += self.settings.alien_points * len(alien_list) # 每个被击杀的外星人都独立判断是否掉落道具 for alien in alien_list: if random.random() > 0.9: pow = Pow(alien.rect.center, self.settings) self.powerups.add(pow) self.sb.prep_score() self.sb.check_high_score() # 后面原有逻辑保持不变 if not self.aliens: self.bullets.empty() self._create_fleet() self.settings.increse_speed() self.stats.level += 1 self.sb.prep_level()
额外注意事项
你的Pow类的update方法里直接调用了self.settings,但你初始化的时候没有把settings传入,后续运行还会报错,需要同步修改Pow类的初始化方法:
class Pow(Sprite): def __init__(self, center, settings): super().__init__() self.settings = settings self.type = random.choice(['shield', 'gun']) self.image = powerup_images[self.type] self.rect = self.image.get_rect() self.rect.center = center self.speedy = 2 def update(self): self.rect.y += self.speedy if self.rect.top >= self.settings.screen_height: self.kill()
内容的提问来源于stack exchange,提问作者Zoidberg
相关产品推荐
相关产品推荐

