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.rightdx 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.
Défi
Moyen- Après
player.x += dx, parcourswalls. - Pour chaque mur avec lequel le joueur entre en collision : lorsque
dx > 0, définisplayer.right = wall.left; lorsquedx < 0, définisplayer.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
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