Le chevalier
Fait partie de la section Projets du Journey Pygame de Coddy. Leçon 23 sur 33.
Le chevalier commence sur le P de la carte.
Son image occupe une tuile entière, de 48 sur 48, tout comme les espaces entre les murs. Un Rect de 48 pixels ne pourrait passer dans un espace que s'il était aligné au pixel près. Le Rect du chevalier est donc plus petit que son image : 32 sur 32, et l'image est dessinée centrée dessus. C'est le Rect qui entre en collision ; c'est l'image que tu vois.
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 rectcell_rect(col, row) est le Rect de 32 sur 32 au milieu d'une tuile. Le chevalier est un sprite, comme le coureur de Sky Runner, créé à un point :
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 = centerDéfi
MoyenPlace le chevalier dans la première salle, sur le P.
- Ajoute les fonctions
drawetcell_rectci-dessus. - Dans
Room, définisself.start = (72, 72); unPdéfinitself.start = cell_rect(col, row).center. - Écris la classe
Knightci-dessus, puis créeknight = Knight(room.start)après la salle. - Après les murs, appelle
draw(knight.image, knight.rect).
Appuie sur « Jouer » : le chevalier se tient sur le P. Puis 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")
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))
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))
for wall in room.walls:
screen.blit(wall_img, wall)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Toutes les leçons de Projets
Entraînez-vous par vous-même : Playground Pygame