Menu
CoddyTech

Aterrizar en plataformas

Parte de la sección Mundos del Journey de Pygame de Coddy. Lección 16 de 35.

Ahora haz que las paredes sostengan al jugador. Después de corregir el movimiento lateral, muévete a lo largo del eje y y corrige ese movimiento de la misma manera: si el jugador se superpone con una pared mientras cae, coloca sus pies sobre la parte superior de la pared.

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 empieza cada fotograma en False y solo al aterrizar pasa a True. Sal de una cornisa y, en el siguiente fotograma, no habrá nada debajo del jugador, así que caerá y no podrá saltar en el aire.

Esto reemplaza la línea FLOOR: la fila inferior del mapa es suelo, igual que cualquier otra pared. La gravedad empuja al jugador 1 píxel hacia el suelo en cada fotograma, y la comprobación del aterrizaje lo levanta de nuevo, así que se queda quieto.

challenge icon

Desafío

Intermedio
  1. Elimina la comprobación de la línea FLOOR.
  2. Después de player.y += vel_y, establece on_ground = False y luego recorre walls.
  3. Para cada pared con la que el jugador colisione mientras vel_y > 0: player.bottom = wall.top, vel_y = 0, on_ground = True.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Mundos

Practica por tu cuenta: Playground de Pygame