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ます。Astroidyourは反復可能なクラスではないため、これにより例外がスローされます。

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

スプライト衝突のドキュメント

ドキュメントからのちょっとしたヒントはpygame.sprite.spritecollideany、通常よりもわずかに高速spritecollideであり、衝突したものが表示されても気にしないため、おそらくより良い選択であるということです。したがって、衝突したものを返す必要はありません。

于 2012-12-21T18:54:13.940 に答える
0

このspritecollide関数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 に答える