Mit kill() entfernen
Teil des Abschnitts Sprites und Bilder der Pygame-Journey von Coddy. Lektion 18 von 36.
Drücke die Leertaste, und das Schiff feuert: Bei jedem Drücken wird der Gruppe lasers ein Laser-Sprite hinzugefügt, und der Zähler oben links zeigt an, wie viele sich in der Gruppe befinden. Feuere ein paar Mal und beobachte, wie der Zähler steigt. Die Laser fliegen oben aus dem Fenster und sind nie wieder zu sehen, aber die Gruppe enthält weiterhin jeden einzelnen davon und aktualisiert und zeichnet sie weiterhin alle. Nach ein paar Minuten Spiel sind das Tausende unsichtbare Laser.
Ein Sprite, das seine Aufgabe erledigt hat, entfernt sich mit kill() selbst:
def update(self):
self.rect.y -= 10
if self.rect.bottom < 0:
self.kill()kill() entfernt das Sprite aus allen Gruppen, in denen es sich befindet. Es wird nicht mehr aktualisiert oder gezeichnet, und Python gibt es frei, sobald keine Variable mehr darauf verweist. Prüfe bottom, nicht top: Der Laser verschwindet, sobald sein letzter Pixel das Fenster verlassen hat, niemals, solange noch ein Teil davon zu sehen ist.
sprite.alive() ist True, solange sich ein Sprite in mindestens einer Gruppe befindet.
Aufgabe
EinfachRufe in Laser.update nach der Bewegung self.kill() auf, wenn sich rect.bottom des Lasers oberhalb des oberen Fensterrands befindet (kleiner als 0). Der Zähler sollte wieder auf 0 sinken, sobald alle Laser das Fenster verlassen haben.
Probier es selbst
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Lasers")
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()
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 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
player = Player()
lasers = pygame.sprite.Group()
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()
screen.fill((20, 22, 40))
lasers.draw(screen)
screen.blit(player.image, player.rect)
count = font.render(f"Lasers: {len(lasers)}", True, (240, 240, 240))
screen.blit(count, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
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