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.dxclass 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.
Aufgabe
Mittel- Schreibe
class Zigzag(Enemy): Das__init__ruftsuper().__init__(image, x, y)auf und setztself.dx = 3. - Das
updateruftsuper().update()auf, addiertself.dxzuself.rect.xund kehrt das Vorzeichen vonself.dxum, wenn das Rect über den linken oder rechten Rand hinausragt. - Mach den gelben Gegner in
enemieszu 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()
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
1Bilder laden
Ein Bild ladenMit einem Rect platzierenDas Bild bewegenEinen Hintergrund kachelnTransparente Pixel2Drehen, Spiegeln, Skalieren
Um den Mittelpunkt drehenIn Flugrichtung ausrichtenEin Bild skalierenVom Original aus drehen3Klassen für Spielobjekte
Deine erste KlasseMethodenSelf ist das ObjektEine Liste von ObjektenObjekte mit BildernEine Unterklasse6Animation mit Sprite Sheets
Ein Sprite Sheet zuschneidenEin Frame-ZählerMit Zeit animierenEine einmalige ExplosionÜbe selbstständig: Pygame-Playground