SpriteCollide wird nur einmal pro Kollision ausgeführt
Ich überprüfe missileGroup
, ob Instanzen missile
mit Instanzen enemy
in kollidiert sind enemyGroup
. Beim Ausführen wird "Hit" für die erste Schleife ausgegeben, die zweite for-Schleife wird jedoch ignoriert. Warum ist das so?
#### 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")
Antworten
pygame.sprite.spritecollide()gibt nicht zurück True
oder False
, aber es wird eine Liste zurückgegeben, die alle Sprites in einer Gruppe enthält , die sich mit einem anderen Sprite überschneiden . Sie müssen bewerten, ob die Liste nicht leer ist, anstatt das Ergebnis zu vergleichen mit True
:
if pygame.sprite.spritecollide(enemy, missileGroup, False) == True:
if pygame.sprite.spritecollide(enemy, missileGroup, False):
Verwenden Sie pygame.sprite.groupcollide()auf jeden Fall alle Sprites, die zwischen zwei Gruppen kollidieren.
if pygame.sprite.groupcollide(missileGroup, enemyGroup, False, False):
print("Hit")
Siehe pygame.sprite.spritecollide():
Gibt eine Liste zurück, die alle Sprites in einer Gruppe enthält, die sich mit einem anderen Sprite überschneiden.
Sehen pygame.sprite.groupcollide()
Dadurch werden Kollisionen zwischen allen Sprites in zwei Gruppen gefunden.
Daher müssen die Argumente spritecollide()
ein pygame.sprite.SpriteObjekt und ein pygame.sprite.GroupObjekt sein. Die Argumente groupcollide()
müssen zwei pygame.sprite.Group
Objekte sein.
Eine Liste von pygame.sprite.Sprite
Objekten anstelle der Gruppe funktioniert nicht.
missileGroup = pygame.sprite.Group()
enemyGroup = pygame.sprite.Group()
Lesen Sie weiter über kill()
Das Sprite wird aus allen Gruppen entfernt, die es enthalten.
Wenn Sie also kill()
die 1. Schleife aufrufen , funktioniert die 2. Schleife nicht, da das Sprite aus allen Gruppen entfernt wird.
Sie rufen kill()
die reset
Methoden auf. bewirkt missile.reset()
jeweils eachEnemy.reset()
einen Ausfall der 2. Schleife.