Der Ritter
Lektion 2 von 20 im Kurs Pygame-Projekt: Verteidige den Bergfried von Coddy.
Der Ritter ist ein Sprite: eine Klasse, die auf pygame.sprite.Sprite basiert und ihr Bild in self.image sowie ihre Position in self.rect speichert.
class Knight(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = knight_img
self.rect = pygame.Rect(0, 0, 24, 24)
self.rect.center = courtyard.centerDas Bild ist 48 Pixel groß, aber das Rect ist nur 24 Pixel groß. Mit dem Rect wird geprüft, ob Monster kollidieren. Ein Monster muss also den Körper des Ritters erreichen und nicht eine leere Ecke um ihn herum. Eine kleine Trefferbox fühlt sich für den Spieler fair an.
Da das Bild und das Rect unterschiedlich groß sind, zeichne das Bild zentriert auf der Mitte des Rects. image.get_rect(center=point) liefert ein Rect in der Größe des Bildes, das auf einem Punkt zentriert ist, und blit akzeptiert es als Position zum Zeichnen:
def draw(image, center):
screen.blit(image, image.get_rect(center=center))Aufgabe
Einfach- Lade das Bild des Ritters:
knight_img = load("knight.png"). - Schreibe die Klasse
Knightwie oben: Bildknight_img, ein 24 × 24 großesrect, zentriert aufcourtyard.center. - Schreibe die Funktion
draw(image, center). - Erstelle vor der Schleife
knight = Knight()und zeichne ihn nach dem Hintergrund mitdraw(knight.image, knight.rect.center).
Probier es selbst
import pygame
WIDTH, HEIGHT = 720, 480
TILE = 48
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Hold the Keep")
clock = pygame.time.Clock()
def load(name):
return pygame.image.load("assets/images/" + name).convert_alpha()
floor_img = load("floor.png")
wall_img = load("wall.png")
courtyard = pygame.Rect(TILE, TILE, WIDTH - 2 * TILE, HEIGHT - 2 * TILE)
background = pygame.Surface((WIDTH, HEIGHT))
for row in range(HEIGHT // TILE):
for col in range(WIDTH // TILE):
x = col * TILE
y = row * TILE
if courtyard.collidepoint(x, y):
background.blit(floor_img, (x, y))
else:
background.blit(wall_img, (x, y))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.blit(background, (0, 0))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Alle Lektionen in Pygame-Projekt: Verteidige den Bergfried
Übe selbstständig: Pygame-Playground