Rozdział 21 · Projekt: kosmiczny strzelec
Trafianie wrogów i zdobywanie punktów
groupcollide() sprawdza kolizje całych grup jednym wyzwaniem – ale punkty trzeba przyznawać ostrożnie.
Rozdział 21.6 sprawdzała kolizje pocisków i wrogów ręcznie, w zagnieżdżonych pętlach z list. Grupy sprite'ów (Rozdział 21.9) rozwiązują ten sam problem jednym wywołaniem:
fragment_bullet_enemy_collisions.py
def resolve_bullet_enemy_collisions(self):
collisions = pygame.sprite.groupcollide(self.bullets, self.enemies, True, True)
destroyed = {{vrag for vragi in collisions.values() for vrag in vragi}}
for vrag in destroyed:
self._spawn_explosion(vrag.rect.center)
return ochki_za_unichtozhennyh(destroyed)
pygame.sprite.groupcollide(a, b, True, True) każdy porównuje
Sprite z a z każdym sprite'm z b i
zwraca słownik: pocisk → lista wrogów, których dotknął. Obie flagi
True oznaczają „usuń ze swojej grupy przy kolizji” — sama grupa przejmuje to samo zadanie, które ręcznie rozwiązywały nowe listy w rozdziale 21.6.
Dlaczego liczenie punktów odbywa się przez set, a nie przez sumę wszystkich par
Jeśli kilka pocisków trafi tego samego wroga w tej samej aktualizacji,
groupcollide() przywróci tego wroga do list dla każdego z nich — ale fizycznie to ten sam zniszczony wróg. Zbierając wszystkich dotkniętych wrogów w zbiór (set) przed punktowaniem każdy przeciwnik jest liczony dokładnie raz, niezależnie od tego, ile kul trafi go jednocześnie.Praktyka: kolizje i liczenie punktów
Zeskanowanie bezpośrednio w przeglądarce – nie wymaga instalacji Pygame
Praktyka kursuje lokalnie