Menu
CoddyTech

Groupes

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

Les sprites se déplacent en groupes : ennemis, lasers, pièces. Un Group contient de nombreux sprites et leur applique à tous la même opération :

enemies = pygame.sprite.Group()
for i in range(5):
    enemies.add(Enemy(64 + i * 128, 60))

Deux appels dans la boucle remplacent les boucles que tu écrivais sur une liste :

enemies.update()
enemies.draw(screen)

enemies.update() appelle update() sur chaque sprite du groupe. enemies.draw(screen) blit le self.image de chaque sprite à son self.rect : c’est pourquoi ces deux noms doivent être exacts. Un sprite dans un groupe n’a pas besoin de sa propre méthode de dessin.

Un groupe connaît aussi sa taille, len(enemies), et tu peux parcourir ses éléments avec for enemy in enemies:. Dessine le groupe après le remplissage, comme n’importe quelle autre image.

challenge icon

Défi

Moyen
  1. Remplacez enemy par un groupe nommé enemies contenant cinq sprites Enemy, centrés aux positions x = 64, 192, 320, 448 et 576, tous à y = 60.
  2. Appelez enemies.update() à chaque image.
  3. Dessinez-les avec enemies.draw(screen), après le remplissage.

Essayez vous-même

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Enemy Group")
clock = pygame.time.Clock()

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
enemy_image = pygame.image.load("assets/images/enemy_red.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 Enemy(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = enemy_image
        self.rect = self.image.get_rect(center=(x, y))

    def update(self):
        self.rect.y += 3
        if self.rect.top > 480:
            self.rect.bottom = 0


player = Player()
enemy = Enemy(320, 60)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.update()
    enemy.update()

    screen.fill((20, 22, 40))
    screen.blit(enemy.image, enemy.rect)
    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