Una sottoclasse
Fa parte della sezione Sprite e immagini del percorso Pygame di Coddy. Lezione 15 di 36.
Alcuni nemici dovrebbero muoversi a zigzag. Cadono come gli altri e scivolano anche lateralmente, invertendo la direzione ai bordi della finestra. Copiare l'intera classe Enemy per modificare un metodo significherebbe dover correggere ogni bug due volte. Una sottoclasse eredita tutto dalla classe genitore e modifica solo ciò che è diverso:
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 che uno Zigzag è un Enemy. Ha draw senza doverlo scrivere. Il suo update sostituisce quello della classe genitore e super().update() esegue prima la versione della classe genitore, così non bisogna scrivere due volte né la caduta né il ritorno in cima. super().__init__(...) fa lo stesso per la configurazione.
Uno Zigzag va nella stessa lista degli altri: il ciclo chiama enemy.update() e ogni oggetto esegue il proprio tipo di aggiornamento.
Sfida
Medio- Scrivi
class Zigzag(Enemy): il suo__init__chiamasuper().__init__(image, x, y)e impostaself.dx = 3. - Il suo
updatechiamasuper().update(), aggiungeself.dxaself.rect.xe inverte il segno diself.dxquando il Rect sporge dal bordo sinistro o destro. - Rendi Zigzag il nemico giallo in
enemies; quelli rosso e verde restano Enemy.
Provalo tu
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()
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Sprite e immagini
1Caricare immagini
Caricare un'immaginePosizionarla con un rettangoloSpostare l'immagineRipetere uno sfondoPixel trasparenti2Ruota, capovolgi, ridimensiona
Ruotare attorno al centroRivolgiti nella direzione in cui voliRidimensionare un'immagineRuotare dall'originale3Classi per gli oggetti del gioco
La tua prima classeMetodiSelf è l’oggettoUna lista di oggettiOggetti con immaginiUna sottoclasse6Animazione con gli sprite sheet
Ritagliare uno sprite sheetUn contatore di frameAnimare con il tempoUn’esplosione a riproduzione singolaEsercitati da solo: Playground Pygame