Menu
CoddyTech

Une sous-classe

Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 15 sur 36.

Certains ennemis devraient se déplacer en zigzag. Ils tombent comme les autres et glissent aussi latéralement, en changeant de direction au bord de la fenêtre. Copier toute la classe Enemy pour modifier une méthode obligerait à corriger chaque bogue deux fois. Une sous-classe hérite de tout de sa classe parente et ne modifie que ce qui diffère :

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) signifie qu’un Zigzag est un Enemy. Il possède draw sans qu’il soit nécessaire de l’écrire. Sa propre méthode update remplace celle de la classe parente, et super().update() exécute d’abord la version de la classe parente, donc la chute et le retour en haut ne sont pas écrits deux fois. super().__init__(...) fait la même chose pour l’initialisation.

Un Zigzag va dans la même liste que les autres : la boucle appelle enemy.update() et chaque objet exécute sa propre version de update.

challenge icon

Défi

Moyen
  1. Écrivez class Zigzag(Enemy) : son __init__ appelle super().__init__(image, x, y) et définit self.dx = 3.
  2. Sa méthode update appelle super().update(), ajoute self.dx à self.rect.x et inverse le signe de self.dx lorsque le Rect dépasse du bord gauche ou droit.
  3. Faites de l’ennemi jaune dans enemies un Zigzag ; les ennemis rouge et vert restent des Enemy.

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Sprites et images

Entraînez-vous par vous-même : Playground Pygame