Buffer de salto
Parte de la sección Mundos del Journey de Pygame de Coddy. Lección 14 de 35.
Los jugadores presionan el botón de salto cuando ven que el aterrizaje se acerca, a menudo unos cuantos fotogramas demasiado pronto. Si el salto se procesa en el evento KEYDOWN, el jugador está en el aire al presionar el botón y la pulsación se pierde. El jugador siente que el juego lo ignoró.
Un búfer de salto recuerda la pulsación durante unos cuantos fotogramas. El evento solo inicia un temporizador:
elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
jump_timer = JUMP_BUFFERCada fotograma, antes de la gravedad, salta si el temporizador sigue activo y el jugador está en el suelo, y reduce el temporizador:
if jump_timer > 0 and on_ground:
vel_y = JUMP
jump_timer = 0
if jump_timer > 0:
jump_timer -= 1Con JUMP_BUFFER = 6, una pulsación cuenta durante 6 fotogramas, una décima de segundo: lo suficiente para registrar una pulsación anticipada, pero no tanto como para que una pulsación mucho antes del aterrizaje provoque un salto inesperado. Una pulsación en el suelo sigue haciendo que el jugador salte en el siguiente fotograma.
Desafío
Difícil- Añade
JUMP_BUFFER = 6al principio yjump_timer = 0antes del bucle. - Al pulsar Espacio o Arriba con
KEYDOWN, establecejump_timer = JUMP_BUFFERen lugar de saltar. - En cada fotograma, antes de la gravedad: cuando
jump_timer > 0yon_ground, establecevel_y = JUMPyjump_timer = 0. Después, sijump_timer > 0, réstale 1.
Pruébalo tú mismo
import pygame
TILE = 36
FLOOR = 324
GRAVITY = 1
JUMP = -15
MAX_FALL = 12
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Jump Buffer")
clock = pygame.time.Clock()
background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
grass_img = pygame.image.load("assets/images/grass.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()
player = player_img.get_rect(topleft=(264, 40))
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()
if keys[pygame.K_LEFT]:
player.x -= 4
if keys[pygame.K_RIGHT]:
player.x += 4
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 x in range(0, 576, TILE):
screen.blit(grass_img, (x, FLOOR))
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 dentroParalaje3Gravedad y salto
Caer con gravedadSaltar desde el sueloSaltos cortosVelocidad máxima de caídaBuffer de salto6Enemigos que patrullan
Un blob patrulleroPisa o recibe un golpeUn ciclo de caminataEnemigos desde el mapaPractica por tu cuenta: Playground de Pygame