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.

Real Window: Błyskowa eksplozja, gdzie kula trafia wroga, wynik na górze wzrasta
Prawdziwym oknem jest moment uderzenia: zarówno pocisk, jak i wróg zostali już usunięti ze swoich grup, eksplozja została wystrzelona.
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
Otwórz praktykę →