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.dxclass 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.
Desafío
Intermedio- Escribe
class Zigzag(Enemy): su__init__llama asuper().__init__(image, x, y)y estableceself.dx = 3. - Su
updatellama asuper().update(), sumaself.dxaself.rect.xy cambia el signo deself.dxcuando Rect sobresale por el borde izquierdo o derecho. - Haz que el enemigo amarillo de
enemiessea 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()
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
1Cargar imágenes
Cargar una imagenColocarla con un rectánguloMover la imagenRepetir un fondo en mosaicoPíxeles transparentes2Girar, voltear y escalar
Girar alrededor del centroApuntar en la dirección del vueloEscalar una imagenGirar desde la imagen original5Colisiones precisas a nivel de píxel
Los rectángulos parecen injustosMáscarasSprites precisos a nivel de píxelHitboxes circulares3Clases para objetos del juego
Tu primera claseMétodosSelf es el objetoUna lista de objetosObjetos con imágenesUna subclase6Animación con hojas de sprites
Recortar una hoja de spritesUn contador de fotogramasAnimar con el tiempoUna explosión de una sola vezPractica por tu cuenta: Playground de Pygame