Projekt końcowy: „Skacząca Piłka”
Ta sama piłka co w sekcji 20.5 — ale teraz z architekturą, która przetrwa rozwój projektu do ponad jednego pliku.
Wróćmy ostatni raz do odbijającej się piłki z sekcji 20.5, ale teraz ją złóżmy na nowo
Ponowne wykorzystanie wszystkiego, co rozdział dodał po drodze: architektury klas
Game (Rozdział 20.26), ruch przez delta time (Rozdział 20.16) oraz
jawne stany gry (Rozdział 20.25).
Co się zmieniło w porównaniu z wersją 20.5
| bouncing_ball_basic.py (20.5) | bouncing_ball.py (ta wersja, Pro) | |
|---|---|---|
| Organizacja Kodeksu | Zmienne globalne, funkcje płaskie | Game klas z handle_events/update/render/run metodami |
| Wniosek | x += dx na klatkę – zależy od FPS | x += vx * dt — nie zależy od FPS (rozdział 20.16) |
| Pauza | Tak | Zjada, zatrzymuje update(), nie tylko renderowanie |
| Restart | Nie, musisz zrestartować program | Klucz, bez restartowania procesu |
| Ocena | Tak | Liczba punktów i licznik odbić |
| Interakcja myszą | Tak | Kliknięcie myszką — opcjonalny obrót piłki w stronę kliknięcia |
class BouncingBallGame:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((SHIRINA, VYSOTA))
self.clock = pygame.time.Clock()
self.state = SostoyanieIgry.IGRA
self.running = True
self._reset_myach()
def update(self, dt):
if self.state is not SostoyanieIgry.IGRA:
return
self.x += self.vx * dt
self.y += self.vy * dt
if self.x - RADIUS < 0 or self.x + RADIUS > SHIRINA:
self.vx = -self.vx
self.otskokov += 1
if self.y - RADIUS < 0 or self.y + RADIUS > VYSOTA:
self.vy = -self.vy
self.otskokov += 1
Kompletny, już zeskanowany plik – osobno:
projects/pygame/bouncing-ball/bouncing_ball.py
Dodaj drugą kulę i zderzenie między tymi dwoma kulami na colliderect() (Rozdział 20.21), nie tylko ścianami.
Dodaj stany MENU i GAME_OVER (sekcja 20.25): gra zaczyna się w MENU po naciśnięciu klawisza, a po określonej liczbie odbić przechodzi do GAME_OVER z końcowym wynikiem na ekranie.
Podsumowanie rozdziału
Czego nauczyliśmy się w tym rozdziale
- Pygame jest biblioteką, a nie silnikiem: zapewnia okno, renderowanie, wejście i dźwięk, a strukturę gry budujesz samodzielnie (Rozdział 20.8).
- Tworzenie gier — cały świat ról, gatunków i platform, a Pygame pewnie obsługuje przede wszystkim desktop, a web i mobile — przez oddzielne narzędzia społeczności (rozdziały 20.6–20.13, 20.29–20.31).
- W tym rozdziale zbudowaliśmy pętlę gry według podstawowego wzoru Input → Update → Render, powtarzanego dziesiątki razy na sekundę (Rozdział 20.14).
- Ruch piksel na klatkę zależy od czyjegoś sprzętu; ruch przez delta time nie jest (Rozdział 20.16).
- pygame.Rect i colliderect() — podstawa kolizji, a hitbox nie musi pokrywać się z obrazkiem (rozdział 20.21).
- Jawne stany gry (enum) oraz separacja handle_events(), update(dt), render() i run() to prosta i użyteczna architektura dla projektów Pygame- oraz dobra podstawa do kolejnego rozdziału (sekcje 20.25–20.26).