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.
Aufgabe
Mittel- Erfasse nach
coins.update()mitpygame.sprite.spritecollidedie Münzen, die den Spieler berühren, und entferne sie. - Addiere die Anzahl der gefangenen Münzen zu
score. Der Starter zeigt bereitsScore: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()
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
1Bilder laden
Ein Bild ladenMit einem Rect platzierenDas Bild bewegenEinen Hintergrund kachelnTransparente Pixel4Spriters und Gruppen
Die Sprite-KlasseGruppenMit kill() entfernenMit spritecollide abfangenGruppe gegen Gruppe2Drehen, Spiegeln, Skalieren
Um den Mittelpunkt drehenIn Flugrichtung ausrichtenEin Bild skalierenVom Original aus drehen3Klassen für Spielobjekte
Deine erste KlasseMethodenSelf ist das ObjektEine Liste von ObjektenObjekte mit BildernEine Unterklasse6Animation mit Sprite Sheets
Ein Sprite Sheet zuschneidenEin Frame-ZählerMit Zeit animierenEine einmalige ExplosionÜbe selbstständig: Pygame-Playground