2012-12-21 177 views
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(以'船'级)

    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专业版。 如果上面的代码不够用,我会在评论中发布整个代码。

+0

您将无法在评论中发布整个代码,顺便说一句。 –

+2

但您可以在问题中编辑更多信息(请参阅编辑链接) –

+1

您不应该在同时遍历对象时尝试删除对象。 –

回答

0

spritecollide function希望你通过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()代替;它返回正确或错误,并且更快:

def hit(self, group): 
    if pygame.sprite.spritecollideany(self, group): 
     self.die() 
2

当您期望得到一个精灵list时,您将一个精灵传递到spritecollide。这是因为您的Astroid不是可迭代类而引发异常。从文档

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

Spritecollide documentation

可爱的小技巧是,pygame.sprite.spritecollideany稍快,则定期spritecollide是和将可能是一个更好的选择,因为你不关心你相撞什么有出现,所以你做不需要返回你碰到的东西。