Le chevalier marche
Fait partie de la section Projets du Journey Pygame de Coddy. Leçon 22 sur 31.
Le chevalier commence sur le P de la carte et se déplace avec les touches fléchées, à raison de 3 pixels par image.
Son image occupe une tuile entière, soit 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 ; l’image, c’est ce 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 rectLes murs l’arrêtent comme le faisaient les plateformes dans Moss Caves : déplace-le le long de l’axe x, pousse-le hors de tout mur qu’il chevauche, puis fais de même le long de l’axe y. En procédant sur un seul axe à la fois, tu peux savoir de quel côté il a été touché.
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
# puis la même chose pour dy, avec bottom et topDéfi
Difficile- Ajoute les fonctions
drawetcell_rectci-dessus. - Dans
Room, définisself.start = (72, 72)avant la boucle, et, pour unP, définisself.start = cell_rect(col, row).center. - Écris
class Knight(pygame.sprite.Sprite): son__init__(self, center)définitself.image = knight_imgainsi qu’unself.rectde 32 sur 32 centré surcenter. Ajoute-lui la méthodemove(dx, dy, blocks)ci-dessus, avec la partie concernant y. - Après la salle, crée
knight = Knight(room.start). - À chaque image, définis
dxà -3 avec la flèche gauche ou à 3 avec la flèche droite, etdyà -3 avec la flèche haut ou à 3 avec la flèche bas (0 sinon), puis appelleknight.move(dx, dy, room.walls). - Dessine le chevalier après les murs :
draw(knight.image, knight.rect).
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()
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Projets
Entraînez-vous par vous-même : Playground Pygame