Menu
CoddyTech

Una subclase

Parte de la sección Sprites e imágenes del Journey de Pygame de Coddy. Lección 15 de 36.

Algunos enemigos deberían moverse en zigzag. Caen como los demás y también se deslizan hacia los lados, girando en los bordes de la ventana. Copiar toda la clase Enemy para cambiar un método implicaría corregir cada error dos veces. Una subclase hereda todo de su clase padre y cambia solo lo que es diferente:

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) significa que un Zigzag es un Enemy. Tiene draw sin necesidad de escribirlo. Su propio update reemplaza al de la clase padre, y super().update() ejecuta primero la versión de la clase padre, así que no hay que escribir dos veces la caída ni el regreso a la parte superior. super().__init__(...) hace lo mismo para la configuración inicial.

Un Zigzag va en la misma lista que los demás: el bucle llama a enemy.update() y cada objeto ejecuta su propio tipo de actualización.

challenge icon

Desafío

Intermedio
  1. Escribe class Zigzag(Enemy): su __init__ llama a super().__init__(image, x, y) y establece self.dx = 3.
  2. Su update llama a super().update(), suma self.dx a self.rect.x y cambia el signo de self.dx cuando Rect sobresale por el borde izquierdo o derecho.
  3. Haz que el enemigo amarillo de enemies sea un Zigzag; los enemigos rojo y verde siguen siendo Enemy.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Sprites e imágenes

Practica por tu cuenta: Playground de Pygame