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.
Défi
Facile- Dans
Knight.__init__, définisself.speed = 3. - Écris
move(self, keys): chaque touche fléchée déplace le rectangle deself.speed, puis appelleself.rect.clamp_ip(courtyard). - 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