El caballero
Parte de la sección Proyectos del Journey de Pygame de Coddy. Lección 23 de 33.
El caballero empieza en la P del mapa.
Su imagen ocupa una baldosa entera, de 48 por 48, y lo mismo ocurre con los espacios entre las paredes. Un Rect de 48 píxeles cabría en un espacio solo si estuviera alineado al píxel exacto. Por eso, el Rect del caballero es más pequeño que su imagen, de 32 por 32, y la imagen se dibuja centrada sobre él. El Rect es lo que colisiona; la imagen es lo que ves.
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) es el Rect de 32 por 32 en el centro de una baldosa. El caballero es un sprite, como el corredor de Sky Runner, creado en un punto:
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 = centerDesafío
IntermedioColoca al caballero en la primera sala, sobre la P.
- Añade las funciones
drawycell_rectarriba. - En
Room, estableceself.start = (72, 72); unaPestableceself.start = cell_rect(col, row).center. - Escribe la clase
Knightde arriba y creaknight = Knight(room.start)después de la sala. - Después de las paredes, llama a
draw(knight.image, knight.rect).
Pulsa «Jugar»: el caballero se queda sobre la P. Después, pulsa «Comprobar».
Pruébalo tú mismo
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()
Todas las lecciones de Proyectos
Practica por tu cuenta: Playground de Pygame