Menu
CoddyTech

Les murs arrêtent le chevalier

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

Le chevalier se déplace avec les touches fléchées, de 3 pixels par image, et les murs l’arrêtent comme le faisaient les plateformes dans Moss Caves : déplace-le le long de l’axe x, repousse-le hors de tout mur qu’il chevauche, puis fais de même le long de l’axe y. En traitant un seul axe à la fois, tu sais de quel côté il a heurté le mur.

def move(self, dx, dy, blocks):
    self.rect.x += dx
    for block in blocks:
        if self.rect.colliderect(block):
            if dx > 0:
                self.rect.right = block.left
            elif dx < 0:
                self.rect.left = block.right
    self.rect.y += dy
    for block in blocks:
        if self.rect.colliderect(block):
            if dy > 0:
                self.rect.bottom = block.top
            elif dy < 0:
                self.rect.top = block.bottom

Lis les flèches à chaque image dans dx et dy, comme dans Catch the Blocks, et transmets les murs de la salle :

keys = pygame.key.get_pressed()
dx = 0
dy = 0
if keys[pygame.K_LEFT]:
    dx = -3
# Droite, Haut et Bas de la même manière
knight.move(dx, dy, room.walls)
challenge icon

Défi

Difficile

Fais marcher le chevalier, en l’arrêtant contre les murs.

  1. Ajoute à Knight la méthode move(dx, dy, blocks) ci-dessus.
  2. À chaque image, définis dx à -3 avec la touche gauche ou à 3 avec la touche droite, et dy à -3 avec la touche haut ou à 3 avec la touche bas, et à 0 dans les autres cas.
  3. Ensuite, appelle knight.move(dx, dy, room.walls).

Appuie sur « Jouer » et marche contre un mur : le chevalier s’arrête contre celui-ci. Ensuite, 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")


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


class Room:
    def __init__(self, lines):
        self.walls = []
        self.start = (72, 72)
        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))
                elif char == "P":
                    self.start = cell_rect(col, row).center


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


room = Room(MAP)
knight = Knight(room.start)

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)
    draw(knight.image, knight.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Toutes les leçons de Projets

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