Menu
CoddyTech

Podklasa

Część sekcji Sprite’y i obrazy ścieżki Pygame w Coddy. Lekcja 15 z 36.

Niektórzy wrogowie powinni poruszać się zygzakiem. Opadają tak jak pozostali, a także przesuwają się na boki, zmieniając kierunek przy krawędziach okna. Skopiowanie całej klasy Enemy, aby zmienić jedną metodę, oznaczałoby konieczność naprawiania każdego błędu dwa razy. Podklasa dziedziczy wszystko po klasie nadrzędnej i zmienia tylko to, co jest inne:

class Zigzag(Enemy):
    def __init__(self, image, x, y):
        super().__init__(image, x, y)
        self.dx = 3

    def update(self):
        super().update()
        self.rect.x += self.dx
        if self.rect.left < 0 or self.rect.right > 640:
            self.dx = -self.dx

class Zigzag(Enemy) oznacza, że obiekt Zigzag jest obiektem Enemy. Ma metodę draw bez konieczności jej zapisywania. Własna metoda update zastępuje metodę klasy nadrzędnej, a super().update() najpierw uruchamia jej wersję, więc opadanie i powrót na górę nie są zapisywane dwa razy. super().__init__(...) robi to samo podczas inicjalizacji.

Obiekt Zigzag trafia na tę samą listę co pozostałe: pętla wywołuje enemy.update(), a każdy obiekt uruchamia własną wersję metody update.

challenge icon

Wyzwanie

Średni
  1. Napisz class Zigzag(Enemy): jego __init__ wywołuje super().__init__(image, x, y) i ustawia self.dx = 3.
  2. Jego update wywołuje super().update(), dodaje self.dx do self.rect.x i zmienia znak self.dx, gdy Rect wystaje poza lewą lub prawą krawędź.
  3. Zmień żółtego przeciwnika w enemies w Zigzag; czerwony i zielony pozostają typu Enemy.

Spróbuj swoich sił

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Enemy Rain")
clock = pygame.time.Clock()

red = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
green = pygame.image.load("assets/images/enemy_green.png").convert_alpha()
yellow = pygame.image.load("assets/images/enemy_yellow.png").convert_alpha()

class Enemy:
    def __init__(self, image, x, y):
        self.image = image
        self.rect = image.get_rect(center=(x, y))
        self.speed = 2

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > 480:
            self.rect.bottom = 0

    def draw(self, screen):
        screen.blit(self.image, self.rect)


enemies = [Enemy(red, 160, 100), Enemy(green, 320, 100), Enemy(yellow, 480, 100)]

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    for enemy in enemies:
        enemy.update()

    screen.fill((20, 22, 40))
    for enemy in enemies:
        enemy.draw(screen)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Sprite’y i obrazy

Poćwicz samodzielnie: Edytor online Pygame