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.
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.
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
Game — w aktach projects/pygame/space-shooter/space_shooter.py, który szczegółowo omawia sekcję 21.25.