Menu
CoddyTech

Die Gegner kommen

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

Nun zu den Gegnern. Ein Enemy-Sprite erhält sein Bild und seine Geschwindigkeit, wenn es erstellt wird, sodass eine Klasse jede Art zeichnen kann:

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.speed = speed

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

Eine Welle besteht aus mehreren Gegnern, die oberhalb des Fensters aufgereiht sind, sodass sie nacheinander erscheinen, jeweils 120 Pixel über dem vorherigen und an einer zufälligen x-Position:

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))

Der erste ist bei y = -40 zentriert, der nächste bei -160 und so weiter: Zu Beginn sind alle außer Sicht. Eine Funktion hält die Welle an einem Ort; die letzte Lektion ruft sie für jede Welle auf.

Ein Gegner, der über den unteren Rand hinausfällt, muss entfernt werden. Töte in der Hauptschleife nach enemies.update() jeden Gegner, dessen Oberkante unter 480 liegt. Später kostet das ein Leben.

challenge icon

Aufgabe

Mittel
  1. Füge import random hinzu, lade enemy_red.png in red_image und schreibe Enemy und spawn_wave.
  2. Erstelle enemies = pygame.sprite.Group() und rufe dann spawn_wave(red_image, 6, 2) auf.
  3. Aktualisiere in jedem Frame die Gegner, entferne diejenigen, deren rect.top über 480 liegt, und zeichne sie vor den Lasern.

Probier es selbst

import pygame

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

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.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))

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


player = Player()
lasers = pygame.sprite.Group()
last_shot = 0

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()

    screen.fill((12, 14, 30))
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    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