SpriteCollide executando apenas uma vez por colisão

Nov 28 2020

Estou verificando missileGroupse alguma ocorrência de missilecolidiu com alguma ocorrência enemyem enemyGroup. Quando executado, ele imprime "Hit" para o primeiro loop, mas ignora o segundo loop for. Por que é que?

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

Respostas

1 Rabbid76 Nov 28 2020 at 19:11

pygame.sprite.spritecollide()não retorna Trueou False, mas retorna uma lista contendo todos os Sprites em um Grupo que se cruzam com outro Sprite . Você deve avaliar se a lista não está vazia em vez de comparar o resultado com True:

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

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

De qualquer forma, use pygame.sprite.groupcollide()para encontrar todos os sprites que colidem entre dois grupos.

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

Veja pygame.sprite.spritecollide():

Retorne uma lista contendo todos os Sprites em um Grupo que se cruzam com outro Sprite.

Vejo pygame.sprite.groupcollide()

Isso encontrará colisões entre todos os Sprites em dois grupos.

Portanto, os argumentos para spritecollide()devem ser um pygame.sprite.Spriteobjeto e um pygame.sprite.Groupobjeto. os argumentos para groupcollide()devem ser dois pygame.sprite.Groupobjetos.
Uma lista de pygame.sprite.Spriteobjetos em vez do Grupo não funciona.

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

Além disso, leia sobre kill()

O Sprite é removido de todos os Grupos que o contêm.

Portanto, se você chamar kill()no 1º loop, o 2º loop não funcionará, porque o sprite é removido de todos os Grupos.

Você chama kill()os resetmétodos. missile.reset()respectivamente, eachEnemy.reset()causa a falha do 2º loop.