SpriteCollide ne s'exécute qu'une fois par collision

Nov 28 2020

Je vérifie missileGroupsi des instances de sont missileentrées en collision avec des instances enemydans enemyGroup. Lorsqu'il est exécuté, il imprime "Hit" pour la première boucle, mais il ignore la deuxième boucle for. Pourquoi donc?

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

Réponses

1 Rabbid76 Nov 28 2020 at 19:11

pygame.sprite.spritecollide()ne renvoie pas Trueou False, mais renvoie une liste contenant tous les Sprites d'un Groupe qui se croisent avec un autre Sprite . Vous devez évaluer si la liste n'est pas vide au lieu de comparer le résultat avec True:

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

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

Quoi qu'il en soit, utilisez pygame.sprite.groupcollide()pour trouver tous les sprites qui entrent en collision entre deux groupes.

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

Voir pygame.sprite.spritecollide():

Renvoie une liste contenant tous les Sprites d'un groupe qui se croisent avec un autre Sprite.

Voir pygame.sprite.groupcollide()

Cela trouvera des collisions entre tous les Sprites dans deux groupes.

Par conséquent, les arguments spritecollide()doivent être un pygame.sprite.Spriteobjet et un pygame.sprite.Groupobjet. les arguments groupcollide()doivent être deux pygame.sprite.Groupobjets.
Une liste d' pygame.sprite.Spriteobjets au lieu du groupe ne fonctionne pas.

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

En outre, lisez sur kill()

Le Sprite est supprimé de tous les groupes qui le contiennent.

Par conséquent, si vous appelez kill()la 1ère boucle, la 2ème boucle ne fonctionnera pas, car le sprite est supprimé de tous les groupes.

Vous appelez kill()les resetméthodes. provoque missile.reset()respectivement eachEnemy.reset()l'échec de la 2ème boucle.