Menu
CoddyTech

Tomber hors du niveau

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

Le sol comporte un trou. Avance dedans et le personnage tombe sans fin, hors de vue. Sa coordonnée y ne cesse d’augmenter et rien ne le ramène.

Le niveau se termine en bas de la fenêtre, à y = 360. Dès que le haut du personnage se trouve en dessous, son corps entier est hors du niveau : replace-le au début et arrête sa chute.

if player.top > 360:
    player.midbottom = start
    vel_y = 0

start est le point que le code de parcours de la carte a enregistré pour la tuile P : le milieu du bord inférieur de cette tuile, là où le personnage se tenait au début. Plus tard, c’est là qu’une vie sera perdue.

challenge icon

Défi

Facile
  1. Après les collisions verticales, lorsque player.top > 360, définis player.midbottom = start et vel_y = 0.

Essayez vous-même

import pygame

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

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

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Pits")
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
    for wall in walls:
        if player.colliderect(wall):
            if vel_y > 0:
                player.bottom = wall.top
                on_ground = True
            elif vel_y < 0:
                player.top = wall.bottom
            vel_y = 0

    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