SpriteCollide executando apenas uma vez por colisão
Estou verificando missileGroup
se alguma ocorrência de missile
colidiu com alguma ocorrência enemy
em 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
pygame.sprite.spritecollide()não retorna True
ou 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.Group
objetos.
Uma lista de pygame.sprite.Sprite
objetos 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 reset
métodos. missile.reset()
respectivamente, eachEnemy.reset()
causa a falha do 2º loop.