Menu
CoddyTech

Mit spritecollide abfangen

Teil des Abschnitts Sprites und Bilder der Pygame-Journey von Coddy. Lektion 19 von 36.

Münzen regnen herab, und das Schiff sollte sie auffangen. Ein Sprite gegen eine ganze Gruppe lässt sich mit einem einzigen Aufruf prüfen:

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

spritecollide(sprite, group, dokill) gibt eine Liste der Sprites in der Gruppe zurück, deren rect das rect des Sprites überlappt. Die Liste ist leer, wenn nichts kollidiert, daher gibt len(caught) an, wie viele Münzen in diesem Frame gefangen wurden.

Das dritte Argument, dokill, legt fest, was mit den Sprites passiert, die kollidieren. True entfernt sie, wie wenn für jedes Sprite kill() aufgerufen würde, sodass eine Münze nur einmal gefangen wird. Bei False bleiben sie erhalten: Das ist richtig für einen Gegner, den du nur anrempelst, aber falsch für eine Münze, die für jeden Frame, in dem sie das Schiff überlappt, einen Punkt hinzufügen würde.

Führe die Prüfung im Aktualisierungsteil der Schleife aus, nachdem sich die Sprites bewegt haben.

challenge icon

Aufgabe

Mittel
  1. Erfasse nach coins.update() mit pygame.sprite.spritecollide die Münzen, die den Spieler berühren, und entferne sie.
  2. Addiere die Anzahl der gefangenen Münzen zu score. Der Starter zeigt bereits Score: und den Punktestand an.

Probier es selbst

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 dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Sprites und Bilder

Übe selbstständig: Pygame-Playground