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().
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