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.speedEine 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.
Aufgabe
Mittel- Füge
import randomhinzu, ladeenemy_red.pnginred_imageund schreibeEnemyundspawn_wave. - Erstelle
enemies = pygame.sprite.Group()und rufe dannspawn_wave(red_image, 6, 2)auf. - 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()
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 Gruppe7Sternenpatrouille
Das PatrouillenschiffLaser abfeuern2Drehen, 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