Menu
CoddyTech

Le chevalier

Fait partie de la section Projets du Journey Pygame de Coddy. Leçon 23 sur 33.

Le chevalier commence sur le P de la carte.

Son image occupe une tuile entière, de 48 sur 48, tout comme les espaces entre les murs. Un Rect de 48 pixels ne pourrait passer dans un espace que s'il était aligné au pixel près. Le Rect du chevalier est donc plus petit que son image : 32 sur 32, et l'image est dessinée centrée dessus. C'est le Rect qui entre en collision ; c'est l'image que tu vois.

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) est le Rect de 32 sur 32 au milieu d'une tuile. Le chevalier est un sprite, comme le coureur de Sky Runner, créé à un point :

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

Défi

Moyen

Place le chevalier dans la première salle, sur le P.

  1. Ajoute les fonctions draw et cell_rect ci-dessus.
  2. Dans Room, définis self.start = (72, 72) ; un P définit self.start = cell_rect(col, row).center.
  3. Écris la classe Knight ci-dessus, puis crée knight = Knight(room.start) après la salle.
  4. Après les murs, appelle draw(knight.image, knight.rect).

Appuie sur « Jouer » : le chevalier se tient sur le P. Puis appuie sur « Vérifier ».

Essayez vous-même

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()

Toutes les leçons de Projets

Entraînez-vous par vous-même : Playground Pygame