Menu
CoddyTech

Un groupe contre un autre

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

Les lasers doivent détruire les ennemis. Il s’agit d’un groupe contre un groupe : chaque laser contre chaque ennemi. groupcollide teste chaque paire à la fois :

hits = pygame.sprite.groupcollide(enemies, lasers, True, True)
score += len(hits)

Les deux True sont les indicateurs dokill, un par groupe : le premier détruit les ennemis touchés, le second les lasers qui les ont touchés. Un laser qui continue à voler après un impact pourrait éliminer un deuxième ennemi situé au-dessus du premier.

hits est un dictionnaire : chaque ennemi touché est une clé, et sa valeur est la liste des lasers qui l’ont touché. len(hits) correspond au nombre d’ennemis touchés pendant cette image, même lorsque deux lasers touchent le même ennemi.

L’ordre des groupes détermine les clés. Avec groupcollide(lasers, enemies, True, True), les clés seraient des lasers, et len(hits) compterait donc les lasers.

challenge icon

Défi

Moyen
  1. Après les mises à jour, vérifie les collisions entre enemies et lasers avec pygame.sprite.groupcollide, en supprimant à la fois l’ennemi et le laser.
  2. Ajoute à score le nombre d’ennemis touchés.

Essayez vous-même

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Laser Hits")
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()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
font = pygame.font.Font(None, 32)


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 += 1
        if self.rect.top > 480:
            self.rect.bottom = 0


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()
enemies = pygame.sprite.Group()
for i in range(5):
    enemies.add(Enemy(64 + i * 128, 60))
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            lasers.add(Laser(player.rect.centerx, player.rect.top))

    player.update()
    lasers.update()
    enemies.update()

    screen.fill((20, 22, 40))
    enemies.draw(screen)
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(text, (10, 10))
    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