Menu
CoddyTech

Capturar com spritecollide

Parte da seção Sprites e imagens do Journey de Pygame da Coddy. Lição 19 de 36.

As moedas caem, e a nave deve pegá-las. Para testar um sprite contra um grupo inteiro, basta uma chamada:

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

spritecollide(sprite, group, dokill) retorna uma lista dos sprites do grupo cujo rect se sobrepõe ao rect do sprite. A lista fica vazia quando nada se toca, então len(caught) é o número de moedas pegas neste quadro.

O terceiro argumento, dokill, indica o que acontece com os sprites que se tocam. True os remove, como se chamássemos kill() em cada um, então cada moeda é pega uma única vez. Com False, eles permanecem: adequado para um inimigo em que você apenas esbarra, mas inadequado para uma moeda, que adicionaria um ponto a cada quadro em que se sobrepusesse à nave.

Faça o teste na parte de atualização do loop, depois que os sprites se moverem.

challenge icon

Desafio

Médio
  1. Depois de coins.update(), colete as moedas que tocam no jogador com pygame.sprite.spritecollide, eliminando-as.
  2. Adicione à score a quantidade de moedas capturadas. O código inicial já exibe Score: e a pontuação.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Sprites e imagens

Pratique por conta própria: Playground de Pygame