SpriteCollide działa tylko raz na kolizję
Sprawdzam, missileGroup
czy jakiekolwiek wystąpienia missile
zderzyły się z jakimikolwiek wystąpieniami enemy
w 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
pygame.sprite.spritecollide()nie zwraca True
lub 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.Group
obiektami.
Lista pygame.sprite.Sprite
obiektó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 reset
metodach. missile.reset()
odpowiednio eachEnemy.reset()
powoduje niepowodzenie drugiej pętli.