SpriteCollide solo se ejecuta una vez por colisión

Nov 28 2020

Estoy verificando missileGroupsi alguna instancia de missilecolisionó con alguna instancia enemyen enemyGroup. Cuando se ejecuta, imprime "Hit" para el primer ciclo, pero ignora el segundo ciclo for. ¿Porqué es eso?

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

Respuestas

1 Rabbid76 Nov 28 2020 at 19:11

pygame.sprite.spritecollide()no devuelve Trueo False, pero devuelve una lista que contiene todos los Sprites de un grupo que se cruzan con otro Sprite . Tienes que evaluar si la lista no está vacía en lugar de comparar el resultado con True:

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

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

De todos modos use pygame.sprite.groupcollide()para encontrar todos los sprites que chocan entre dos grupos.

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

Ver pygame.sprite.spritecollide():

Devuelve una lista que contiene todos los Sprites de un grupo que se cruzan con otro Sprite.

Ver pygame.sprite.groupcollide()

Esto encontrará colisiones entre todos los Sprites en dos grupos.

Por lo tanto, los argumentos de spritecollide()deben ser un pygame.sprite.Spriteobjeto y un pygame.sprite.Groupobjeto. los argumentos de groupcollide()deben ser dos pygame.sprite.Groupobjetos.
No funciona una lista de pygame.sprite.Spriteobjetos en lugar del Grupo .

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

Además lea sobre kill()

El Sprite se elimina de todos los Grupos que lo contienen.

Por lo tanto, si llama kill()en el primer ciclo, el segundo ciclo no funcionará, porque el sprite se elimina de todos los grupos.

Llamas kill()a los resetmétodos. missile.reset()respectivamente, eachEnemy.reset()hace que falle el segundo bucle.