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.
Aufgabe
Mittel- Schreibe wie oben die Klasse
Enemymit__init__(self, image, x, y),update(self)unddraw(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. - Erstelle
enemiesals Liste mit drei Elementen: das rote in der Mitte bei (160, 100), das grüne bei (320, 100), das gelbe bei (480, 100). - 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
1Bilder laden
Ein Bild ladenMit einem Rect platzierenDas Bild bewegenEinen Hintergrund kachelnTransparente Pixel2Drehen, 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