Menu
CoddyTech

Murs à gauche et à droite

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

Les blocs sont dessinés, mais le joueur les traverse. Un mur doit arrêter le joueur. Déplace-le d’abord, puis corrige le déplacement : si le joueur chevauche maintenant un mur, repousse-le de l’autre côté, dans la direction d’où il vient.

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

dx correspond au déplacement latéral de cette image : une valeur positive signifie vers la droite. En allant vers la droite, le joueur heurte le côté gauche du mur, donc son bord droit s’aligne sur celui-ci. En allant vers la gauche, son bord gauche s’aligne sur le côté droit du mur.

La carte est intégrée à walls, une liste de Rects, comme dans Maps from Text. Le sol est toujours la ligne à FLOOR, et le joueur peut toujours tomber sur le dessus d’un bloc : l’atterrissage sur les murs sera abordé ensuite.

challenge icon

Défi

Moyen
  1. Après player.x += dx, parcours walls.
  2. Pour chaque mur avec lequel le joueur entre en collision : lorsque dx > 0, définis player.right = wall.left ; lorsque dx < 0, définis player.left = wall.right.

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("Walls")
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

    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()

Toutes les leçons de Les mondes

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