Menu
CoddyTech

Catturare con spritecollide

Fa parte della sezione Sprite e immagini del percorso Pygame di Coddy. Lezione 19 di 36.

Le monete piovono e la nave dovrebbe raccoglierle. Per uno sprite contro un intero gruppo basta una sola chiamata:

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

spritecollide(sprite, group, dokill) restituisce un elenco degli sprite del gruppo il cui rect si sovrappone al rect dello sprite. L'elenco è vuoto quando non c'è contatto, quindi len(caught) è il numero di monete raccolte in questo fotogramma.

Il terzo argomento, dokill, specifica cosa succede agli sprite che entrano in contatto. True li elimina, come se si chiamasse kill() su ciascuno di essi, quindi una moneta viene raccolta una sola volta. Con False restano: è giusto per un nemico contro cui urti soltanto, ma non per una moneta, che aggiungerebbe un punto a ogni fotogramma in cui si sovrappone alla nave.

Esegui il controllo nella parte di aggiornamento del ciclo, dopo che gli sprite si sono mossi.

challenge icon

Sfida

Medio
  1. Dopo coins.update(), raccogli le monete che toccano il giocatore usando pygame.sprite.spritecollide, eliminandole.
  2. Aggiungi a score il numero di monete raccolte. Il codice iniziale mostra già Score: e il punteggio.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Sprite e immagini

Esercitati da solo: Playground Pygame