Uma subclasse
Parte da seção Sprites e imagens do Journey de Pygame da Coddy. Lição 15 de 36.
Alguns inimigos devem se mover em zigue-zague. Eles caem como os outros e também deslizam para os lados, mudando de direção nas bordas da janela. Copiar toda a classe Enemy para alterar um método significaria corrigir cada bug duas vezes. Uma subclasse herda tudo da classe pai e altera apenas o que é 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 um Zigzag é um Enemy. Ele tem draw sem precisar escrevê-lo. Seu próprio update substitui o da classe pai, e super().update() executa primeiro a versão da classe pai, então a queda e o retorno ao topo não são escritos duas vezes. super().__init__(...) faz o mesmo na configuração.
Um Zigzag entra na mesma lista que os outros: o loop chama enemy.update(), e cada objeto executa seu próprio tipo de atualização.
Desafio
Médio- Escreva
class Zigzag(Enemy): seu__init__chamasuper().__init__(image, x, y)e defineself.dx = 3. - Seu
updatechamasuper().update(), adicionaself.dxaself.rect.xe inverte o sinal deself.dxquando o Rect ultrapassa a borda esquerda ou direita. - Faça do inimigo amarelo em
enemiesum Zigzag; os inimigos vermelho e verde continuam sendo Enemy.
Experimente você mesmo
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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Sprites e imagens
1Carregando imagens
Carregue uma imagemPosicione-a com um RectMova a imagemLadrilhe o plano de fundoPixels transparentes2Girar, Inverter, Redimensionar
Girar em torno do centroFicar de frente para a direção do vooRedimensionar uma imagemGirar a partir do original3Classes para Objetos de Jogos
Sua primeira classeMétodosSelf é o objetoUma lista de objetosObjetos com imagensUma subclasse6Animação com Sprite Sheets
Recorte uma Sprite SheetUm contador de quadrosAnime com o tempoUma explosão de disparo únicoPratique por conta própria: Playground de Pygame