Menu
CoddyTech

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.center

Das 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))
challenge icon

Aufgabe

Einfach
  1. Lade das Bild des Ritters: knight_img = load("knight.png").
  2. Schreibe die Klasse Knight wie oben: Bild knight_img, ein 24 × 24 großes rect, zentriert auf courtyard.center.
  3. Schreibe die Funktion draw(image, center).
  4. Erstelle vor der Schleife knight = Knight() und zeichne ihn nach dem Hintergrund mit draw(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