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.
Sfida
Medio- Dopo
coins.update(), raccogli le monete che toccano il giocatore usandopygame.sprite.spritecollide, eliminandole. - Aggiungi a
scoreil 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()
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Sprite e immagini
1Caricare immagini
Caricare un'immaginePosizionarla con un rettangoloSpostare l'immagineRipetere uno sfondoPixel trasparenti4Sprite e gruppi
La classe SpriteGruppiRimuovere con kill()Catturare con spritecollideGruppo contro gruppo2Ruota, capovolgi, ridimensiona
Ruotare attorno al centroRivolgiti nella direzione in cui voliRidimensionare un'immagineRuotare dall'originale3Classi per gli oggetti del gioco
La tua prima classeMetodiSelf è l’oggettoUna lista di oggettiOggetti con immaginiUna sottoclasse6Animazione con gli sprite sheet
Ritagliare uno sprite sheetUn contatore di frameAnimare con il tempoUn’esplosione a riproduzione singolaEsercitati da solo: Playground Pygame