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 rectcell_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 = centerAufgabe
MittelPlatziere den Ritter im ersten Raum auf dem P.
- Füge oben die Funktionen
drawundcell_recthinzu. - Setze in
Roomself.start = (72, 72); einPsetztself.start = cell_rect(col, row).center. - Schreibe oben die Klasse
Knightund erstelle nach dem Raumknight = Knight(room.start). - 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