Détecter avec spritecollide
Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 19 sur 36.
Les pièces tombent, et le vaisseau doit les attraper. Pour un sprite face à tout un groupe, un seul appel suffit :
caught = pygame.sprite.spritecollide(player, coins, True)
score += len(caught)spritecollide(sprite, group, dokill) renvoie une liste des sprites du groupe dont le rect chevauche le rect du sprite. La liste est vide quand rien ne se touche, donc len(caught) correspond au nombre de pièces attrapées pendant cette frame.
Le troisième argument, dokill, indique ce qui arrive aux sprites qui se touchent. True les supprime, comme si on appelait kill() sur chacun d'eux, donc une pièce n'est attrapée qu'une fois. Avec False, ils restent : c'est bien pour un ennemi qu'on ne fait que heurter, mais pas pour une pièce, qui ajouterait un point à chaque frame où elle chevauche le vaisseau.
Effectue le test dans la partie de la boucle consacrée à la mise à jour, après le déplacement des sprites.
Défi
Moyen- Après
coins.update(), récupère les pièces qui touchent le joueur avecpygame.sprite.spritecollide, en les supprimant. - Ajoute le nombre de pièces récupérées à
score. Le code de départ affiche déjàScore:et le score.
Essayez vous-même
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()
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Sprites et images
1Charger des images
Charger une imageLa placer avec un rectangleDéplacer l’imageRépéter un arrière-planPixels transparents4Sprites et groupes
La classe SpriteGroupesSupprimer avec kill()Détecter avec spritecollideUn groupe contre un autre2Tourner, retourner, redimensionner
Faire pivoter autour du centreRegarder dans la direction du volRedimensionner une imagePivoter à partir de l’original5Collisions au pixel près
Les rectangles semblent injustesMasquesSprites au pixel prèsZones de collision circulaires3Les classes pour les objets du jeu
Votre première classeLes méthodesSelf est l’objetUne liste d’objetsDes objets avec des imagesUne sous-classe6Animation à partir de feuilles de sprites
Découper une feuille de spritesUn compteur de framesAnimer avec le tempsUne explosion à déclenchement uniqueEntraînez-vous par vous-même : Playground Pygame