Menu
CoddyTech

Atterrir sur les plateformes

Fait partie de la section Les mondes du Journey Pygame de Coddy. Leçon 16 sur 35.

Maintenant, les murs peuvent soutenir le joueur. Une fois le déplacement latéral corrigé, déplace-le selon y et corrige ce déplacement de la même façon : si le joueur chevauche un mur en tombant, pose ses pieds sur le haut du mur.

vel_y = min(vel_y + GRAVITY, MAX_FALL)
player.y += vel_y
on_ground = False
for wall in walls:
    if player.colliderect(wall):
        if vel_y > 0:
            player.bottom = wall.top
            vel_y = 0
            on_ground = True

on_ground est réinitialisé à False à chaque image et seul un atterrissage le fait passer à True. Marche au-delà du bord d'une plateforme : à l'image suivante, rien ne se trouve sous le joueur, qui tombe donc et ne peut pas sauter dans les airs.

Cela remplace la ligne FLOOR : la rangée du bas de la carte est un sol comme n'importe quel autre mur. La gravité tire le joueur d'un pixel dans le sol à chaque image, et le test d'atterrissage le remonte, de sorte qu'il reste immobile.

challenge icon

Défi

Moyen
  1. Supprime le test de ligne FLOOR.
  2. Après player.y += vel_y, définis on_ground = False, puis parcours walls.
  3. Pour chaque mur avec lequel le joueur entre en collision lorsque vel_y > 0 : player.bottom = wall.top, vel_y = 0, on_ground = True.

Essayez vous-même

import pygame

TILE = 36
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12
FLOOR = 324

LEVEL = [
    "................",
    "................",
    "................",
    "....P.....###...",
    "................",
    "................",
    "...####.........",
    "............#...",
    "#.......#...#..#",
    "################",
]

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Landing")
clock = pygame.time.Clock()

background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
block_img = pygame.image.load("assets/images/block.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()

walls = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        if char == "#":
            walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))
        elif char == "P":
            start = (col * TILE + TILE // 2, row * TILE + TILE)

player = player_img.get_rect(midbottom=start)
vel_y = 0
on_ground = False

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
            if on_ground:
                vel_y = JUMP
        elif event.type == pygame.KEYUP and event.key in (pygame.K_SPACE, pygame.K_UP):
            if vel_y < -4:
                vel_y = -4

    keys = pygame.key.get_pressed()
    dx = 0
    if keys[pygame.K_LEFT]:
        dx -= SPEED
    if keys[pygame.K_RIGHT]:
        dx += SPEED

    player.x += dx
    for wall in walls:
        if player.colliderect(wall):
            if dx > 0:
                player.right = wall.left
            elif dx < 0:
                player.left = wall.right

    vel_y = min(vel_y + GRAVITY, MAX_FALL)
    player.y += vel_y
    on_ground = False
    if player.bottom > FLOOR:
        player.bottom = FLOOR
        vel_y = 0
        on_ground = True

    for y in range(0, 360, 72):
        for x in range(0, 576, 72):
            screen.blit(background, (x, y))
    for wall in walls:
        screen.blit(block_img, wall)
    screen.blit(player_img, player)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Les mondes

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