Gruppe gegen Gruppe
Teil des Abschnitts Sprites und Bilder der Pygame-Journey von Coddy. Lektion 20 von 36.
Laser sollten Gegner zerstören. Dabei tritt eine Gruppe gegen eine andere Gruppe an: jeder Laser gegen jeden Gegner. groupcollide prüft jedes Paar auf einmal:
hits = pygame.sprite.groupcollide(enemies, lasers, True, True)
score += len(hits)Die beiden True-Werte sind die dokill-Flags, eines pro Gruppe: Das erste entfernt die getroffenen Gegner, das zweite die Laser, die sie getroffen haben. Ein Laser, der nach einem Treffer weiterfliegt, könnte einen zweiten Gegner über dem ersten ausschalten.
hits ist ein Dictionary: Jeder getroffene Gegner ist ein Schlüssel, und sein Wert ist die Liste der Laser, die ihn getroffen haben. len(hits) ist die Anzahl der Gegner, die in diesem Frame getroffen wurden, selbst wenn zwei Laser denselben Gegner getroffen haben.
Die Reihenfolge der Gruppen bestimmt, was die Schlüssel sind. Bei groupcollide(lasers, enemies, True, True) wären die Schlüssel Laser, und len(hits) würde stattdessen die Laser zählen.
Aufgabe
Mittel- Teste nach den Aktualisierungen
enemiesmitlasersmithilfe vonpygame.sprite.groupcollideund entferne sowohl den Gegner als auch den Laser. - Addiere die Anzahl der getroffenen Gegner zu
score.
Probier es selbst
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Laser Hits")
clock = pygame.time.Clock()
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
enemy_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.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 Enemy(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = enemy_image
self.rect = self.image.get_rect(center=(x, y))
def update(self):
self.rect.y += 1
if self.rect.top > 480:
self.rect.bottom = 0
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = laser_image
self.rect = self.image.get_rect(midbottom=(x, y))
def update(self):
self.rect.y -= 10
if self.rect.bottom < 0:
self.kill()
player = Player()
lasers = pygame.sprite.Group()
enemies = pygame.sprite.Group()
for i in range(5):
enemies.add(Enemy(64 + i * 128, 60))
score = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
lasers.add(Laser(player.rect.centerx, player.rect.top))
player.update()
lasers.update()
enemies.update()
screen.fill((20, 22, 40))
enemies.draw(screen)
lasers.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