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 = Trueon_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.
Desafío
Intermedio- Elimina la comprobación de la línea
FLOOR. - Después de
player.y += vel_y, estableceon_ground = Falsey luego recorrewalls. - 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()
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Mundos
1Mapas a partir de texto
Un nivel en textoFilas y columnasLetras con significadoDónde empieza el jugadorUna pantalla a la vez4Colisiones con plataformas
Paredes a izquierda y derechaAterrizar en plataformasGolpearse la cabezaCaer fuera del nivelUn eje a la vez5Una cámara con desplazamiento
Un desplazamiento de cámaraSeguir al jugadorMantener la cámara dentroParalajePractica por tu cuenta: Playground de Pygame