Menu
CoddyTech

Eine Unterklasse

Teil des Abschnitts Sprites und Bilder der Pygame-Journey von Coddy. Lektion 15 von 36.

Einige Gegner sollten im Zickzack laufen. Sie fallen wie die anderen und gleiten außerdem seitwärts, wobei sie an den Fensterrändern die Richtung ändern. Die gesamte Klasse Enemy zu kopieren, um eine Methode zu ändern, würde bedeuten, jeden Fehler zweimal beheben zu müssen. Eine Unterklasse übernimmt alles von ihrer übergeordneten Klasse und ändert nur, was anders ist:

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) bedeutet, dass ein Zigzag ein Enemy ist. Es hat draw, ohne dass du es schreiben musst. Die eigene Methode update ersetzt die der übergeordneten Klasse, und super().update() führt zuerst deren Version aus, sodass das Fallen und die Rückkehr nach oben nicht zweimal geschrieben werden müssen. super().__init__(...) macht dasselbe für die Einrichtung.

Ein Zigzag kommt in dieselbe Liste wie die anderen: Die Schleife ruft enemy.update() auf, und jedes Objekt führt seine eigene Art von Aktualisierung aus.

challenge icon

Aufgabe

Mittel
  1. Schreibe class Zigzag(Enemy): Das __init__ ruft super().__init__(image, x, y) auf und setzt self.dx = 3.
  2. Das update ruft super().update() auf, addiert self.dx zu self.rect.x und kehrt das Vorzeichen von self.dx um, wenn das Rect über den linken oder rechten Rand hinausragt.
  3. Mach den gelben Gegner in enemies zu einem Zigzag; red und green bleiben Enemy.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Sprites und Bilder

Übe selbstständig: Pygame-Playground