SpriteCollide działa tylko raz na kolizję

Nov 28 2020

Sprawdzam, missileGroupczy jakiekolwiek wystąpienia missilezderzyły się z jakimikolwiek wystąpieniami enemyw programie enemyGroup. Po uruchomieniu drukuje "Hit" dla pierwszej pętli, ale ignoruje drugą pętlę for. Dlaczego?

 #### 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")

Odpowiedzi

1 Rabbid76 Nov 28 2020 at 19:11

pygame.sprite.spritecollide()nie zwraca Truelub False, ale zwraca listę zawierającą wszystkie Sprite'y w grupie, które przecinają się z innym Sprite'em . Musisz ocenić, czy lista nie jest pusta, zamiast porównać wynik z True:

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

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

W każdym razie użyj, pygame.sprite.groupcollide()aby znaleźć wszystkie duszki, które zderzają się między dwiema grupami.

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

Zobacz pygame.sprite.spritecollide():

Zwróć listę zawierającą wszystkie duszki w grupie, które przecinają się z innym duchem.

Widzieć pygame.sprite.groupcollide()

To wykryje kolizje między wszystkimi Spritami w dwóch grupach.

Dlatego argumenty spritecollide()muszą być pygame.sprite.Spriteprzedmiotem i pygame.sprite.Groupprzedmiotem. argumenty groupcollide()muszą być dwoma pygame.sprite.Groupobiektami.
Lista pygame.sprite.Spriteobiektów zamiast grupy nie działa.

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

Przeczytaj również o kill()

Sprite jest usuwany ze wszystkich grup, które go zawierają.

Dlatego jeśli wywołasz kill()w pierwszej pętli, druga pętla nie zadziała, ponieważ duszek zostanie usunięty ze wszystkich grup.

Dzwonisz kill()w resetmetodach. missile.reset()odpowiednio eachEnemy.reset()powoduje niepowodzenie drugiej pętli.