Menu
CoddyTech

Detectar colisiones con spritecollide

Parte de la sección Sprites e imágenes del Journey de Pygame de Coddy. Lección 19 de 36.

Las monedas caen, y la nave debe atraparlas. Una sola llamada basta para comprobar un sprite contra todo un grupo:

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

spritecollide(sprite, group, dokill) devuelve una lista de los sprites del grupo cuyo rect se superpone al rect del sprite. La lista está vacía cuando nada toca el sprite, así que len(caught) es el número de monedas atrapadas en este fotograma.

El tercer argumento, dokill, indica qué ocurre con los sprites que tocan el sprite. True los elimina, igual que si se llamara a kill() para cada uno, así que una moneda solo se atrapa una vez. Con False, permanecen: es adecuado para un enemigo con el que solo chocas, pero no para una moneda, que sumaría un punto en cada fotograma en que se superpusiera a la nave.

Haz la comprobación en la parte de actualización del bucle, después de que los sprites se hayan movido.

challenge icon

Desafío

Intermedio
  1. Después de coins.update(), recoge las monedas que tocan al jugador con pygame.sprite.spritecollide y elimínalas.
  2. Suma a score cuántas monedas se atraparon. El código inicial ya muestra Score: y la puntuación.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Sprites e imágenes

Practica por tu cuenta: Playground de Pygame