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.
Desafío
Intermedio- Después de
coins.update(), recoge las monedas que tocan al jugador conpygame.sprite.spritecollidey elimínalas. - Suma a
scorecuántas monedas se atraparon. El código inicial ya muestraScore: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()
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
1Cargar imágenes
Cargar una imagenColocarla con un rectánguloMover la imagenRepetir un fondo en mosaicoPíxeles transparentes4Sprites y grupos
La clase SpriteGruposEliminar con kill()Detectar colisiones con spritecollideGrupo contra grupo2Girar, voltear y escalar
Girar alrededor del centroApuntar en la dirección del vueloEscalar una imagenGirar desde la imagen original5Colisiones precisas a nivel de píxel
Los rectángulos parecen injustosMáscarasSprites precisos a nivel de píxelHitboxes circulares3Clases para objetos del juego
Tu primera claseMétodosSelf es el objetoUna lista de objetosObjetos con imágenesUna subclase6Animación con hojas de sprites
Recortar una hoja de spritesUn contador de fotogramasAnimar con el tiempoUna explosión de una sola vezPractica por tu cuenta: Playground de Pygame