Menu
CoddyTech

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.speed

Uma 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.

challenge icon

Desafio

Médio
  1. Adicione import random, carregue enemy_red.png em red_image e escreva Enemy e spawn_wave.
  2. Crie enemies = pygame.sprite.Group() e, em seguida, chame spawn_wave(red_image, 6, 2).
  3. A cada quadro, atualize os inimigos, elimine aqueles cujo rect.top ultrapasse 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()
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Playground de Pygame