Rozdział 21 · Projekt: kosmiczny strzelec

Uderzenia i kolizje

colliderect() sprawdza kolizje — trafienie niszczy wroga, a wróg może zniszczyć statek.

Niszczyć wrogów

Zderzenie kuli z wrogiem sprawdza gotową metodę Rect.colliderect() — po trafieniu oba są usuwane ze swoich list, a wynik się zwiększa:

unichtozhenie_vragov.py
novye_puli = []
novye_vragi = list(vragi)
for pulya in puli:
    popala = False
    for vrag in list(novye_vragi):
        if pulya.colliderect(vrag):
            novye_vragi.remove(vrag)
            schet += 10
            popala = True
            break
    if not popala:
        novye_puli.append(pulya)
puli = novye_puli
vragi = novye_vragi
Dlaczego nie usuwać elementów bezpośrednio podczas iterowania po liście?
Usuń element z listy vragi bezpośrednio w pętli for vrag in vragi: może pominąć sąsiednie elementy — lista „przesuwa się” pod nogami pętli. Bezpieczniej zebrać nowe listy ocalałych pocisków i wrogów, jak pokazano powyżej. Ostateczna wersja (Rozdział 21.9) rozwiązuje ten sam problem bez ręcznych list – za pośrednictwem pygame.sprite.Group oraz groupcollide().
Real Window: Pomarańczowy błysk w momencie, gdy kula trafiła wroga, wynik wzrósł do 100
Prawdziwe okno — moment trafienia: wróg zniszczony, wynik zwiększył się dokładnie jeden raz.

Gdy wróg niszczy statek

Jeśli wróg dotrze na dół ekranu lub zderzy się ze statkiem, gra kończy się:

unichtozhenie_korablya.py
for vrag in vragi:
    if vrag.bottom >= VYSOTA or vrag.colliderect(korabl):
        igra_okonchena = True
        break
Natychmiastowy koniec gry — również rozwiązanie tymczasowe
Tutaj jedno starcie natychmiast kończy grę. Ostateczna wersja (sekcja 21.16) zastępuje to systemem żyć z tymczasową niewrażliwością po trafieniu, dzięki czemu trzech wrogów zderzających się jednocześnie ze statkiem nie odbiera trzech żyć naraz.
Praktyka: Pociski, wrogowie i zderzenia statków
Pygame otwiera natywne okno Python – uruchomione lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →