Menu
CoddyTech

Détecter avec spritecollide

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

Les pièces tombent, et le vaisseau doit les attraper. Pour un sprite face à tout un groupe, un seul appel suffit :

caught = pygame.sprite.spritecollide(player, coins, True)
score += len(caught)

spritecollide(sprite, group, dokill) renvoie une liste des sprites du groupe dont le rect chevauche le rect du sprite. La liste est vide quand rien ne se touche, donc len(caught) correspond au nombre de pièces attrapées pendant cette frame.

Le troisième argument, dokill, indique ce qui arrive aux sprites qui se touchent. True les supprime, comme si on appelait kill() sur chacun d'eux, donc une pièce n'est attrapée qu'une fois. Avec False, ils restent : c'est bien pour un ennemi qu'on ne fait que heurter, mais pas pour une pièce, qui ajouterait un point à chaque frame où elle chevauche le vaisseau.

Effectue le test dans la partie de la boucle consacrée à la mise à jour, après le déplacement des sprites.

challenge icon

Défi

Moyen
  1. Après coins.update(), récupère les pièces qui touchent le joueur avec pygame.sprite.spritecollide, en les supprimant.
  2. Ajoute le nombre de pièces récupérées à score. Le code de départ affiche déjà Score: et le score.

Essayez vous-même

import random
import pygame

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

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
coin_image = pygame.image.load("assets/images/coin.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 Coin(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = coin_image
        self.rect = self.image.get_rect(center=(random.randint(20, 620), random.randint(-400, -20)))

    def update(self):
        self.rect.y += 2
        if self.rect.top > 480:
            self.rect.center = (random.randint(20, 620), -20)


player = Player()
coins = pygame.sprite.Group()
for i in range(6):
    coins.add(Coin())
score = 0

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

    player.update()
    coins.update()

    screen.fill((20, 22, 40))
    coins.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