Courir et sauter
Fait partie de la section Les mondes du Journey Pygame de Coddy. Leçon 29 sur 35.
Maintenant, l’explorateur se déplace, avec tout ce qui concerne la gravité, les sauts et les collisions avec les plateformes, dans cet ordre à chaque image :
- Lire les flèches dans
dx, se déplacer le long de x, repousser le personnage hors des murs. - Ajouter la gravité jusqu’à
MAX_FALL, se déplacer le long de y, atterrir ou se cogner la tête, et définiron_ground. - Si le joueur tombe sous la fenêtre, le replacer à
start.
Le saut commence lors d’un KEYDOWN de la barre d’espace ou de la flèche vers le haut lorsque on_ground est vrai, et un KEYUP réduit une montée rapide à -4 pour les petits sauts.
Ajoutez les constantes de vitesse en haut : SPEED = 4, GRAVITY = 1, JUMP = -15, MAX_FALL = 12. Avec ces nombres, un saut s’élève d’environ 100 pixels : assez pour monter une marche de deux tuiles et franchir un trou de deux tuiles.
Défi
Moyen- Ajoute les quatre constantes et, avant la boucle,
vel_y = 0eton_ground = False. - Dans les événements : saute avec Espace ou Flèche haut lorsque
on_ground; lors duKEYUPde l’une ou l’autre, ramènevel_yà -4 lorsqu’il est inférieur à -4. - À chaque image : déplace et corrige x, puis déplace et corrige y comme dans Bump Your Head.
- Lorsque
player.top > HEIGHT, définisplayer.midbottom = startetvel_y = 0.
Essayez vous-même
import pygame
TILE = 36
WIDTH, HEIGHT = 576, 360
LEVEL = [
"................................................................",
"................................................................",
"................................................................",
"................................................................",
"#..............................................................#",
"#....................C.........................#####...........#",
"#......CC...C................CC.....CC.........#####.....CC....#",
"#....................#.........................D...............#",
"#.P.........#...E....#...^.......K......E......D.C....^......F.#",
"#######..####################..##########################..#####",
]
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Moss Caves")
clock = pygame.time.Clock()
def load(name):
return pygame.image.load("assets/images/" + name).convert_alpha()
background = pygame.image.load("assets/backgrounds/forest.png").convert_alpha()
grass_img = load("grass.png")
grass_left_img = load("grass_left.png")
grass_right_img = load("grass_right.png")
dirt_img = load("dirt.png")
player_img = load("player.png")
def solid(row, col):
if row < 0 or row >= len(LEVEL) or col < 0 or col >= len(LEVEL[0]):
return False
return LEVEL[row][col] == "#"
walls = []
tiles = []
for row, line in enumerate(LEVEL):
for col, char in enumerate(line):
rect = pygame.Rect(col * TILE, row * TILE, TILE, TILE)
if char == "#":
if solid(row - 1, col):
image = dirt_img
elif not solid(row, col - 1) and solid(row, col + 1):
image = grass_left_img
elif solid(row, col - 1) and not solid(row, col + 1):
image = grass_right_img
else:
image = grass_img
walls.append(rect)
tiles.append((image, rect))
elif char == "P":
start = rect.midbottom
player = player_img.get_rect(midbottom=start)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
for y in range(0, HEIGHT, 72):
for x in range(0, WIDTH, 72):
screen.blit(background, (x, y))
for image, rect in tiles:
screen.blit(image, rect)
screen.blit(player_img, player)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Toutes les leçons de Les mondes
1Des cartes à partir de texte
Un niveau en texteLignes et colonnesDes lettres qui ont un sensOù commence le joueurUn écran à la fois4Collisions avec les plateformes
Murs à gauche et à droiteAtterrir sur les plateformesSe cogner la têteTomber hors du niveauUn axe à la foisEntraînez-vous par vous-même : Playground Pygame