Menu
CoddyTech

Les ennemis arrivent

Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 32 sur 36.

Passons maintenant aux ennemis. Un sprite Enemy reçoit son image et sa vitesse lors de sa création, ce qui permet à une seule classe de dessiner toutes les sortes d’ennemis :

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

Une vague est composée de plusieurs ennemis, alignés au-dessus de la fenêtre pour qu’ils arrivent l’un après l’autre, chacun à 120 pixels au-dessus du précédent, à une position x aléatoire :

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))

Le premier est centré à y = -40, le suivant à -160, et ainsi de suite : ils sont tous hors de vue au départ. Une fonction garde la vague au même endroit ; la leçon précédente l’appelle pour chaque vague.

Un ennemi qui tombe au-delà du bas de l’écran doit disparaître. Dans la boucle principale, après enemies.update(), élimine tout ennemi dont le haut dépasse 480. Plus tard, cela coûtera une vie.

challenge icon

Défi

Moyen
  1. Ajoute import random, charge enemy_red.png dans red_image, et écris Enemy et spawn_wave.
  2. Crée enemies = pygame.sprite.Group(), puis appelle spawn_wave(red_image, 6, 2).
  3. À chaque image, mets à jour les ennemis, supprime ceux dont rect.top dépasse 480, et dessine-les avant les lasers.

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Sprites et images

Entraînez-vous par vous-même : Playground Pygame