Menu
CoddyTech

Objekte mit Bildern

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

Die Gegner sind Bilder, die sich auf Rects bewegen, und das Startgerüst verwaltet drei Rects und drei Blits von Hand. Eine Klasse kann ein Bild und das dazugehörige Rect zusammenhalten:

class Enemy:
    def __init__(self, image, x, y):
        self.image = image
        self.rect = image.get_rect(center=(x, y))
        self.speed = 2

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > 480:
            self.rect.bottom = 0

    def draw(self, screen):
        screen.blit(self.image, self.rect)

Das Bild wird übergeben und nicht in __init__ geladen. Lade jede Datei einmal am Anfang und übergib dieselbe Surface an alle Gegner, die dieses Bild verwenden: Zehn rote Gegner teilen sich ein rotes Bild. Jeder Gegner bekommt jedoch ein eigenes Rect, damit sich jeder für sich bewegt.

Den Gegner zu bewegen bedeutet, sein Rect zu bewegen, und ihn zu zeichnen bedeutet, sein Bild an der Position des Rects zu blitten: Das sind die beiden Attribute, die jedes Spielobjekt in diesem Abschnitt hat.

challenge icon

Aufgabe

Mittel
  1. Schreibe wie oben die Klasse Enemy mit __init__(self, image, x, y), update(self) und draw(self, screen): Das Rect ist bei (x, y) zentriert, bewegt sich pro Frame 2 Pixel nach unten und springt wieder über den oberen Rand, sobald es sich unterhalb des Fensters befindet.
  2. Erstelle enemies als Liste mit drei Elementen: das rote in der Mitte bei (160, 100), das grüne bei (320, 100), das gelbe bei (480, 100).
  3. Aktualisiere und zeichne jeden Gegner in der Liste; entferne die drei Rects.

Probier es selbst

import pygame

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

red = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
green = pygame.image.load("assets/images/enemy_green.png").convert_alpha()
yellow = pygame.image.load("assets/images/enemy_yellow.png").convert_alpha()

red_rect = red.get_rect(center=(160, 100))
green_rect = green.get_rect(center=(320, 100))
yellow_rect = yellow.get_rect(center=(480, 100))

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

    for rect in (red_rect, green_rect, yellow_rect):
        rect.y += 2
        if rect.top > 480:
            rect.bottom = 0

    screen.fill((20, 22, 40))
    screen.blit(red, red_rect)
    screen.blit(green, green_rect)
    screen.blit(yellow, yellow_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Alle Lektionen in Sprites und Bilder

Übe selbstständig: Pygame-Playground