Menu
CoddyTech

Die Sprite-Klasse

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

Jedes Spielobjekt hatte bisher ein Bild, ein Rect, ein update und eine Möglichkeit, gezeichnet zu werden. pygame hat dafür genau die passende Klasse: pygame.sprite.Sprite. Deine Spielobjekte werden zu Unterklassen davon:

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

Drei Regeln. Rufe zuerst super().__init__() auf: Dadurch wird eingerichtet, was die Sprite-Klasse intern benötigt. Nenne das Bild genau self.image und die Position self.rect: Der Code von pygame selbst liest diese beiden Namen aus. Platziere die Regeln, die für jeden Frame gelten, in update.

Das Schiffsbild wird oben einmal als ship_image geladen und von der Klasse verwendet. Zeichne das Sprite vorerst mit einem Blit: screen.blit(player.image, player.rect). In der nächsten Lektion lässt du pygame es zeichnen.

challenge icon

Aufgabe

Mittel
  1. Schreibe wie oben class Player(pygame.sprite.Sprite): self.image ist ship_image, und die Mitte der Unterkante von self.rect liegt bei (320, 470).
  2. Die Methode update bewegt das Rect mit den Pfeiltasten um 6 Pixel nach links oder rechts und begrenzt es auf das Fenster: Verschiebe die entsprechenden Zeilen aus dem Startercode in diese Methode.
  3. Erstelle player = Player(), rufe in jedem Frame player.update() auf und blitte player.image an der Position von player.rect.

Probier es selbst

import pygame

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

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
ship_rect = ship_image.get_rect(midbottom=(320, 470))

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

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        ship_rect.x -= 6
    if keys[pygame.K_RIGHT]:
        ship_rect.x += 6
    ship_rect.clamp_ip(screen.get_rect())

    screen.fill((20, 22, 40))
    screen.blit(ship_image, ship_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Alle Lektionen in Sprites und Bilder

Übe selbstständig: Pygame-Playground