SpriteCollide wird nur einmal pro Kollision ausgeführt

Nov 28 2020

Ich überprüfe missileGroup, ob Instanzen missilemit Instanzen enemyin kollidiert sind enemyGroup. Beim Ausführen wird "Hit" für die erste Schleife ausgegeben, die zweite for-Schleife wird jedoch ignoriert. Warum ist das so?

 #### Imagine this is in a game loop ####
        for missile in missileGroup:
            if pygame.sprite.spritecollide(missile, enemyGroup, False) :
                print("Hit")

        
        for enemy in enemyGroup:
            if pygame.sprite.spritecollide(enemy, missileGroup, False) == True:
                print("HI")

Antworten

1 Rabbid76 Nov 28 2020 at 19:11

pygame.sprite.spritecollide()gibt nicht zurück Trueoder False, aber es wird eine Liste zurückgegeben, die alle Sprites in einer Gruppe enthält , die sich mit einem anderen Sprite überschneiden . Sie müssen bewerten, ob die Liste nicht leer ist, anstatt das Ergebnis zu vergleichen mit True:

if pygame.sprite.spritecollide(enemy, missileGroup, False) == True:

if pygame.sprite.spritecollide(enemy, missileGroup, False):

Verwenden Sie pygame.sprite.groupcollide()auf jeden Fall alle Sprites, die zwischen zwei Gruppen kollidieren.

if pygame.sprite.groupcollide(missileGroup, enemyGroup, False, False):
    print("Hit")

Siehe pygame.sprite.spritecollide():

Gibt eine Liste zurück, die alle Sprites in einer Gruppe enthält, die sich mit einem anderen Sprite überschneiden.

Sehen pygame.sprite.groupcollide()

Dadurch werden Kollisionen zwischen allen Sprites in zwei Gruppen gefunden.

Daher müssen die Argumente spritecollide()ein pygame.sprite.SpriteObjekt und ein pygame.sprite.GroupObjekt sein. Die Argumente groupcollide()müssen zwei pygame.sprite.GroupObjekte sein.
Eine Liste von pygame.sprite.SpriteObjekten anstelle der Gruppe funktioniert nicht.

missileGroup = pygame.sprite.Group()
enemyGroup = pygame.sprite.Group()

Lesen Sie weiter über kill()

Das Sprite wird aus allen Gruppen entfernt, die es enthalten.

Wenn Sie also kill()die 1. Schleife aufrufen , funktioniert die 2. Schleife nicht, da das Sprite aus allen Gruppen entfernt wird.

Sie rufen kill()die resetMethoden auf. bewirkt missile.reset()jeweils eachEnemy.reset()einen Ausfall der 2. Schleife.