0

这是我得到的错误:

Traceback (most recent call last):
  File "C:\Users\Mendel Hornbacher\My programs\Spaceblaster\SpaceBlaster0.0.2b.py", line 95, in <module>
    animate()
  File "C:\Users\Mendel Hornbacher\My programs\Spaceblaster\SpaceBlaster0.0.2b.py", line 53, in animate
    ship.hit(astroid_list)
  File "C:\Users\Mendel Hornbacher\My programs\Spaceblaster\SpaceBlaster0.0.2b.py", line 34, in hit
    if pygame.sprite.spritecollide(self, item, False):
  File "C:\Python33\lib\site-packages\pygame\sprite.py", line 1515, in spritecollide
    return [s for s in group if spritecollide(s.rect)]
TypeError: 'Astroid' object is not iterable

这些是所涉及的类:

  1. 动画:

    def animate():
        ship.hit(astroid_list)
        ship.move()
        screen.fill([0,0,0])
        astroid_list.draw(screen)
        screen.blit(ship.image, ship.rect)
        pygame.display.flip()
    
  2. self.hit(在“Ship”类中)

    def hit(self, group):
            for item in group:
                group.remove(item)
                if pygame.sprite.spritecollide(self, item, False):
                    self.die()
                group.add(item)
    
  3. astroid_list

    astroid_list = pygame.sprite.Group()
    

如果这意味着什么,我正在运行 Windows 8 pro。如果上面的代码还不够,我会在评论中发布整个代码。

4

2 回答 2

2

spritecollide当它期望获得一个精灵时,您正在传递一个list精灵。这导致抛出异常,因为您Astroid不是可迭代的类。

def hit(self, group):
    if pygame.sprite.spritecollide(self, group, False):
        self.die()

Spritecollide 文档

文档中的一个不错的小提示是,pygame.sprite.spritecollideany它比常规的要快一些spritecollide,并且可能是一个更好的选择,因为您不关心与它发生碰撞的内容,因此您不需要返回所碰撞的内容。

于 2012-12-21T18:54:13.940 回答
0

spritecollide函数希望您传递 a Group,而不是单个精灵。

只需一次性测试您的整个团队:

def hit(self, group):
    if pygame.sprite.spritecollide(self, group, False):
        self.die()

现在,您还可以避免在循环遍历列表时删除和添加项目。

如果您想self从组中删除与碰撞的精灵,请在调用后执行此操作spritecollide()

def hit(self, group):
    collided = pygame.sprite.spritecollide(self, group, False)
    for item in collided:
        group.remove(item)
    if collided:
        self.die()

但是,您可以将dokill标志设置为 True,而不是手动删除每个项目,它们将从组中删除:

def hit(self, group):
    if pygame.sprite.spritecollide(self, group, True):
        self.die()

如果您不需要知道哪些项目发生了碰撞并且不想从组中删除项目,请spritecollideany()改用;它只返回 True 或 False 并且速度更快:

def hit(self, group):
    if pygame.sprite.spritecollideany(self, group):
        self.die()
于 2012-12-21T18:55:22.343 回答