Menu
CoddyTech

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 :

  1. Lire les flèches dans dx, se déplacer le long de x, repousser le personnage hors des murs.
  2. Ajouter la gravité jusqu’à MAX_FALL, se déplacer le long de y, atterrir ou se cogner la tête, et définir on_ground.
  3. 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.

challenge icon

Défi

Moyen
  1. Ajoute les quatre constantes et, avant la boucle, vel_y = 0 et on_ground = False.
  2. Dans les événements : saute avec Espace ou Flèche haut lorsque on_ground ; lors du KEYUP de l’une ou l’autre, ramène vel_y à -4 lorsqu’il est inférieur à -4.
  3. À chaque image : déplace et corrige x, puis déplace et corrige y comme dans Bump Your Head.
  4. Lorsque player.top > HEIGHT, définis player.midbottom = start et vel_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

Entraînez-vous par vous-même : Playground Pygame