Menu
CoddyTech

Marcher

Leçon 3 sur 20 du cours Projet Pygame : Défendez le donjon de Coddy.

pygame.key.get_pressed() indique quelles touches sont maintenues enfoncées en ce moment. Consulte-la à chaque image et le chevalier marche tant qu’une flèche est maintenue enfoncée, sans attendre la répétition des touches.

Donne au chevalier une speed et une méthode move, afin que les règles de déplacement soient associées au chevalier :

def move(self, keys):
    if keys[pygame.K_LEFT]:
        self.rect.x -= self.speed
    if keys[pygame.K_RIGHT]:
        self.rect.x += self.speed
    self.rect.clamp_ip(courtyard)

Quatre if distincts, pas de elif : si Haut et Droite sont maintenues enfoncées ensemble, le chevalier marche en diagonale.

clamp_ip ramène un Rect à l’intérieur d’un autre Rect s’il en est sorti, de sorte que le chevalier s’arrête aux murs. _ip signifie « sur place » : cela modifie self.rect lui-même au lieu de renvoyer un nouveau Rect.

challenge icon

Défi

Facile
  1. Dans Knight.__init__, définis self.speed = 3.
  2. Écris move(self, keys) : chaque touche fléchée déplace le rectangle de self.speed, puis appelle self.rect.clamp_ip(courtyard).
  3. Dans la boucle de jeu, avant de dessiner, appelle knight.move(pygame.key.get_pressed()).

Essayez vous-même

import pygame

WIDTH, HEIGHT = 720, 480
TILE = 48

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Hold the Keep")
clock = pygame.time.Clock()


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

courtyard = pygame.Rect(TILE, TILE, WIDTH - 2 * TILE, HEIGHT - 2 * TILE)
background = pygame.Surface((WIDTH, HEIGHT))
for row in range(HEIGHT // TILE):
    for col in range(WIDTH // TILE):
        x = col * TILE
        y = row * TILE
        if courtyard.collidepoint(x, y):
            background.blit(floor_img, (x, y))
        else:
            background.blit(wall_img, (x, y))


def draw(image, center):
    screen.blit(image, image.get_rect(center=center))


class Knight(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = knight_img
        self.rect = pygame.Rect(0, 0, 24, 24)
        self.rect.center = courtyard.center


knight = Knight()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.blit(background, (0, 0))
    draw(knight.image, knight.rect.center)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Toutes les leçons de Projet Pygame : Défendez le donjon

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