Rozdział 21 · Projekt: kosmiczny strzelec

Dzielenie gry na klasy

Pięć klas z jasnymi odpowiedzialnościami zamiast tylko globalnych zmiennych i list.

Kod historyczny dla sekcji 21.1 do 21.7 przechowuje statek, wrogów i pociski jako oddzielne zmienne oraz listy Rect, ale cała logika jest w samej pętli gry. To jest Działa w małej grze, ale rozwija się słabo: im więcej zasad, tym trudniej zrozumieć, która z nich Za co odpowiada kod. Ostateczna wersja dzieli grę na pięć klas z jasnymi obowiązkami.

Gamescreenclockassetsplayerbulletsenemiesexplosionsstatescoreliveshandle_events()handle_input(dt)update(dt)render()run()
Game kontroluje cały stan gry i koordynuje pozostałe klasy – sam nie losuje przeciwnika i nie przesuwa pocisków bezpośrednio.
GamePlayerWŁAŚCICIEL
Game przechowuje jedną kopię Player.
GameGrupy sprite'ówWŁAŚCICIEL
Game utrzymuje jeden pygame.sprite.Group dla Bullet, Enemy i Explosion.

Bullet, Enemy oraz Explosion są spadkobiercami pygame.sprite.Sprite (Rozdział 20.19 już pokazała, dlaczego potrzebne są sprite'y: obiekt ma .image oraz .rect, które rozumieją gotowe funkcje kolizji i grup). Przechowywać je w pygame.sprite.Group, a nie w zwykłej liście, wygodne z tego samego powodu co w sekcji 21.6: grupa sama potrafi usuwać obiekt (.kill()) bez ryzyka „przerwania” pygame.sprite.groupcollide() (rozdział 21.15) sprawdza kolizje między całymi grupami jednym wywołaniem.

fragment_game_init.py
class Game:
    def __init__(self, *, rng=None, debug=False):
        pygame.init()
        self.screen = pygame.display.set_mode((SHIRINA, VYSOTA))
        self.clock = pygame.time.Clock()
        self.assets = AssetStore(IMAGE_DIR, AUDIO_DIR)
        self.rng = rng if rng is not None else random.Random()

        self.state = GameStatus.MENU
        self.bullets = pygame.sprite.Group()
        self.enemies = pygame.sprite.Group()
        self.explosions = pygame.sprite.Group()
        self.player = self._make_player()
        self.score = 0
        self.lives = STARTING_LIVES
To szkic, a nie pełny plik
Kompletna, gotowa do uruchomienia sala lekcyjna Game — w aktach projects/pygame/space-shooter/space_shooter.py, który szczegółowo omawia sekcję 21.25.
Ta architektura nie jest prawem uniwersalnym
Podział na Game/Player/Bullet/Enemy/Explosion — wygodne rozwiązanie właśnie dla projektu tego rozmiaru, a nie jedyny poprawny sposób budowania każdej gry. Rozdział 20.8 już wyjaśniał: różne narzędzia i projekty mogą mieć bardzo różną architekturę.
Praktyka: szkic klasy Game
Pygame otwiera natywne okno Python – uruchomione lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →