Menu
CoddyTech

Explosionen

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

Ein Gegner, der in einem einzigen Frame verschwindet, lässt es so wirken, als wäre nichts passiert. Platziere dort, wo er war, eine Explosion: die Einmal-Animation aus Kapitel 6 als Sprite in einer eigenen Gruppe.

for enemy in hits:
    score += 10
    explosions.add(Explosion(enemy.rect.center))

Ein zerstörtes Sprite hat weiterhin sein Rect, also ist enemy.rect.center die Stelle, an der es getroffen wurde. Die Explosion spielt explosion_1.png bis explosion_4.png ab, jeweils 5 Frames lang, und zerstört sich selbst.

Lade die vier Bilder vor der Schleife in eine Liste, explosion_frames. Aktualisiere explosions in jedem Frame und zeichne die Gruppe zuletzt über alles andere, damit die Explosion das Schiff und die Laser überdeckt, mit denen sie sich überschneidet.

Sounds, ein wackelnder Bildschirm und fliegende Funken kommen in Abschnitt 6 hinzu und bauen auf derselben Schleife auf.

challenge icon

Aufgabe

Mittel
  1. Lade explosion_1.png bis explosion_4.png in die Liste explosion_frames.
  2. Schreibe die Klasse Explosion aus der Lektion „Eine einmalige Explosion“, die mit einem center erstellt wird.
  3. Erstelle explosions = pygame.sprite.Group(); füge bei jedem zerstörten Gegner eine Explosion an dessen Mittelpunkt hinzu; aktualisiere sie in jedem Frame und zeichne sie nach dem Raumschiff.

Probier es selbst

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
red_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()


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 Laser(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = laser_image
        self.rect = self.image.get_rect(midbottom=(x, y))
        self.mask = pygame.mask.from_surface(self.image)

    def update(self):
        self.rect.y -= 10
        if self.rect.bottom < 0:
            self.kill()


class Enemy(pygame.sprite.Sprite):
    def __init__(self, image, x, y, speed):
        super().__init__()
        self.image = image
        self.rect = self.image.get_rect(center=(x, y))
        self.mask = pygame.mask.from_surface(self.image)
        self.speed = speed

    def update(self):
        self.rect.y += self.speed


def spawn_wave(image, count, speed):
    for i in range(count):
        x = random.randint(40, 600)
        enemies.add(Enemy(image, x, -40 - i * 120, speed))


player = Player()
lasers = pygame.sprite.Group()
enemies = pygame.sprite.Group()
last_shot = 0
score = 0
spawn_wave(red_image, 6, 2)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.update()
    keys = pygame.key.get_pressed()
    now = pygame.time.get_ticks()
    if keys[pygame.K_SPACE] and now - last_shot >= 250:
        lasers.add(Laser(player.rect.centerx, player.rect.top))
        last_shot = now
    lasers.update()
    enemies.update()
    for enemy in enemies:
        if enemy.rect.top > 480:
            enemy.kill()
    hits = pygame.sprite.groupcollide(enemies, lasers, True, True, pygame.sprite.collide_mask)
    for enemy in hits:
        score += 10

    screen.fill((12, 14, 30))
    enemies.draw(screen)
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_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