Menu
CoddyTech

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_BUFFER

Cada 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 -= 1

Con 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.

challenge icon

Desafío

Difícil
  1. Añade JUMP_BUFFER = 6 al principio y jump_timer = 0 antes del bucle.
  2. Al pulsar Espacio o Arriba con KEYDOWN, establece jump_timer = JUMP_BUFFER en lugar de saltar.
  3. En cada fotograma, antes de la gravedad: cuando jump_timer > 0 y on_ground, establece vel_y = JUMP y jump_timer = 0. Después, si jump_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()
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