Menu
CoddyTech

Le chevalier

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

Le chevalier est un sprite : une classe construite à partir de pygame.sprite.Sprite qui conserve son image dans self.image et sa position dans self.rect.

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

L’image mesure 48 pixels de côté, mais le Rect ne mesure que 24 pixels. C’est le Rect que les monstres heurteront : un monstre doit donc atteindre le corps du chevalier, et non un coin de l’espace vide autour de lui. Une petite boîte de collision semble plus équitable pour le joueur.

Comme l’image et le Rect n’ont pas la même taille, dessine l’image centrée sur le centre du Rect. image.get_rect(center=point) renvoie un Rect de la taille de l’image, centré sur un point, et blit l’accepte comme position de dessin :

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

Défi

Facile
  1. Charge l’image du chevalier : knight_img = load("knight.png").
  2. Écris la classe Knight ci-dessus : l’image knight_img, un rect de 24 par 24 centré sur courtyard.center.
  3. Écris la fonction draw(image, center).
  4. Avant la boucle, crée knight = Knight(), puis, après l’arrière-plan, dessine-le avec draw(knight.image, knight.rect.center).

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

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



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

    screen.blit(background, (0, 0))
    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