Os Inimigos Chegam
Parte da seção Sprites e imagens do Journey de Pygame da Coddy. Lição 32 de 36.
Agora, os inimigos. Um sprite Enemy recebe sua imagem e velocidade quando é criado, então uma classe pode desenhar todos os tipos:
class Enemy(pygame.sprite.Sprite):
def __init__(self, image, x, y, speed):
super().__init__()
self.image = image
self.rect = self.image.get_rect(center=(x, y))
self.speed = speed
def update(self):
self.rect.y += self.speedUma onda é composta por vários inimigos, alinhados acima da janela para que apareçam um após o outro, cada um 120 pixels acima do anterior, em posições x aleatórias:
def spawn_wave(image, count, speed):
for i in range(count):
x = random.randint(40, 600)
enemies.add(Enemy(image, x, -40 - i * 120, speed))O primeiro fica centralizado em y = -40, o próximo em -160 e assim por diante: todos fora de vista no início. Uma função mantém a onda em um só lugar; a lição anterior a chama para cada onda.
Um inimigo que cai além da parte inferior precisa ser removido. No loop principal, depois de enemies.update(), elimine qualquer inimigo cujo topo passe de 480. Mais tarde, isso custará uma vida.
Desafio
Médio- Adicione
import random, carregueenemy_red.pngemred_imagee escrevaEnemyespawn_wave. - Crie
enemies = pygame.sprite.Group()e, em seguida, chamespawn_wave(red_image, 6, 2). - A cada quadro, atualize os inimigos, elimine aqueles cujo
rect.topultrapasse 480 e desenhe-os antes dos lasers.
Experimente você mesmo
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = ship_image
self.rect = self.image.get_rect(midbottom=(320, 470))
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.rect.x -= 6
if keys[pygame.K_RIGHT]:
self.rect.x += 6
self.rect.clamp_ip(screen.get_rect())
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = laser_image
self.rect = self.image.get_rect(midbottom=(x, y))
def update(self):
self.rect.y -= 10
if self.rect.bottom < 0:
self.kill()
player = Player()
lasers = pygame.sprite.Group()
last_shot = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
player.update()
keys = pygame.key.get_pressed()
now = pygame.time.get_ticks()
if keys[pygame.K_SPACE] and now - last_shot >= 250:
lasers.add(Laser(player.rect.centerx, player.rect.top))
last_shot = now
lasers.update()
screen.fill((12, 14, 30))
lasers.draw(screen)
screen.blit(player.image, player.rect)
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 transparentes4Sprites e Grupos
A classe SpriteGruposRemover com kill()Capturar com spritecollideGrupo contra grupo7Patrulha Espacial
A Nave de PatrulhaDispare Lasers2Girar, 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