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.centerL’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))Défi
Facile- Charge l’image du chevalier :
knight_img = load("knight.png"). - Écris la classe
Knightci-dessus : l’imageknight_img, unrectde 24 par 24 centré surcourtyard.center. - Écris la fonction
draw(image, center). - Avant la boucle, crée
knight = Knight(), puis, après l’arrière-plan, dessine-le avecdraw(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