Menu
CoddyTech

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 rect

cell_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 = center
challenge icon

Desafío

Intermedio

Coloca al caballero en la primera sala, sobre la P.

  1. Añade las funciones draw y cell_rect arriba.
  2. En Room, establece self.start = (72, 72); una P establece self.start = cell_rect(col, row).center.
  3. Escribe la clase Knight de arriba y crea knight = Knight(room.start) después de la sala.
  4. 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