Menu
CoddyTech

Der Ritter

Teil des Abschnitts Projekte der Pygame-Journey von Coddy. Lektion 23 von 33.

Der Ritter startet auf dem P der Karte.

Sein Bild ist ein ganzes Kachelstück, 48 mal 48, und genauso groß sind die Lücken zwischen den Wänden. Ein 48 Pixel großes Rect würde nur dann in eine Lücke passen, wenn es genau an den Pixeln ausgerichtet ist. Deshalb ist das Rect des Ritters kleiner als sein Bild, 32 mal 32, und das Bild wird mittig darauf gezeichnet. Das Rect ist das, womit Kollisionen erkannt werden; das Bild ist das, was du siehst.

def draw(image, rect):
    screen.blit(image, image.get_rect(center=rect.center))


def cell_rect(col, row):
    rect = pygame.Rect(0, 0, 32, 32)
    rect.center = (col * TILE + 24, row * TILE + 24)
    return rect

cell_rect(col, row) ist das 32 mal 32 große Rect in der Mitte einer Kachel. Der Ritter ist ein Sprite, wie der Läufer aus Sky Runner, der an einem Punkt erstellt wird:

class Knight(pygame.sprite.Sprite):
    def __init__(self, center):
        super().__init__()
        self.image = knight_img
        self.rect = pygame.Rect(0, 0, 32, 32)
        self.rect.center = center
challenge icon

Aufgabe

Mittel

Platziere den Ritter im ersten Raum auf dem P.

  1. Füge oben die Funktionen draw und cell_rect hinzu.
  2. Setze in Room self.start = (72, 72); ein P setzt self.start = cell_rect(col, row).center.
  3. Schreibe oben die Klasse Knight und erstelle nach dem Raum knight = Knight(room.start).
  4. Rufe nach den Wänden draw(knight.image, knight.rect) auf.

Drücke „Spielen“: Der Ritter steht auf dem P. Klicke dann auf „Prüfen“.

Probier es selbst

import pygame

TILE = 48
MAP = [
    "##############",
    "#............#",
    "#.P......K...#",
    "#............#",
    "#....##......D",
    "#....##......#",
    "##.#######.###",
    "#............#",
    "#...S....H...#",
    "##############",
]

pygame.init()
screen = pygame.display.set_mode((672, 480))
pygame.display.set_caption("Rune Keep")
clock = pygame.time.Clock()
font = pygame.font.Font("assets/fonts/pixel.ttf", 32)


def load(name):
    return pygame.image.load("assets/images/" + name).convert_alpha()


floor_img = load("floor.png")
wall_img = load("wall.png")
knight_img = load("knight.png")
door_img = load("dungeon_door.png")
key_img = load("key.png")
slime_img = load("slime.png")
spider_img = load("spider.png")
heart_img = load("heart.png")
empty_img = load("heart_empty.png")
sword_img = load("sword.png")
potion_img = load("potion_red.png")


class Room:
    def __init__(self, lines):
        self.walls = []
        for row, line in enumerate(lines):
            for col, char in enumerate(line):
                if char == "#":
                    self.walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))


room = Room(MAP)

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

    for row in range(10):
        for col in range(14):
            screen.blit(floor_img, (col * TILE, row * TILE))
    for wall in room.walls:
        screen.blit(wall_img, wall)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Alle Lektionen in Projekte

Übe selbstständig: Pygame-Playground