Menu
CoddyTech

Buffer del salto

Fa parte della sezione Mondi del percorso Pygame di Coddy. Lezione 14 di 35.

I giocatori premono il tasto per saltare quando vedono che l’atterraggio è imminente, spesso con qualche frame di anticipo. Con il salto nell’evento KEYDOWN, quella pressione trova il personaggio in aria e viene persa. Il giocatore ha la sensazione che il gioco lo abbia ignorato.

Una finestra di buffer per il salto memorizza la pressione per alcuni frame. L’evento avvia solo un timer:

elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
    jump_timer = JUMP_BUFFER

A ogni frame, prima della gravità, salta se il timer è ancora attivo e il personaggio è a terra, quindi decrementa il timer:

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 pressione viene considerata valida per 6 frame, un decimo di secondo: abbastanza a lungo da accettare una pressione anticipata, ma abbastanza poco da evitare che una pressione data molto prima dell’atterraggio faccia saltare all’improvviso. Una pressione a terra fa comunque saltare al frame successivo.

challenge icon

Sfida

Difficile
  1. Aggiungi JUMP_BUFFER = 6 in cima e jump_timer = 0 prima del ciclo.
  2. Quando si verifica un KEYDOWN di Spazio o Freccia su, imposta jump_timer = JUMP_BUFFER invece di saltare.
  3. A ogni fotogramma, prima della gravità: quando jump_timer > 0 e on_ground, imposta vel_y = JUMP e jump_timer = 0. Poi, se jump_timer > 0, sottrai 1.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Mondi

Esercitati da solo: Playground Pygame