Menu
CoddyTech

La première salle du donjon

Fait partie de la section Projets du Journey Pygame de Coddy. Leçon 21 sur 31.

Ton prochain jeu est Rune Keep : un chevalier vu de dessus, piégé dans un donjon composé de trois salles. Chaque salle contient une clé, une porte verrouillée et des monstres. Trouve la clé, ouvre la porte, atteins la salle suivante et sors avec tes cœurs.

Une salle est une carte textuelle, comme dans Moss Caves : 14 colonnes sur 10 lignes de tuiles de 48 pixels, qui remplissent une fenêtre de 672 sur 480. # est un mur. Les autres lettres prendront vie dans les leçons suivantes : P le chevalier, K la clé, D la porte, S un slime, H une potion. Pour l'instant, ce sont des cases de sol.

Une classe Room crée tout ce que contient une salle à partir de sa carte. Plus tard, le chevalier passera d'une salle à l'autre, et chaque nouvelle salle s'écrira sur une ligne : Room(MAP2).

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

Pour dessiner un mur, blitte son image à sa Rect : screen.blit(wall_img, wall) place l'image en haut à gauche de la Rect.

challenge icon

Défi

Facile

Le code de départ ouvre la fenêtre, la recouvre de dalles de sol et charge la police ainsi que toutes les images dont le donjon a besoin, en préparation des prochaines leçons : knight_img, key_img, slime_img et les autres.

  1. Dans Room.__init__, parcourez lines et ajoutez un Rect de 48 par 48 à self.walls, à l’emplacement (col * TILE, row * TILE), pour chaque #. Le code de départ crée déjà room = Room(MAP).
  2. Après le sol, affichez wall_img à l’emplacement de chaque Rect dans room.walls.

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 = []
        # construisez les murs ici


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))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Toutes les leçons de Projets

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