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_BUFFERA 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 -= 1Con 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.
Sfida
Difficile- Aggiungi
JUMP_BUFFER = 6in cima ejump_timer = 0prima del ciclo. - Quando si verifica un
KEYDOWNdi Spazio o Freccia su, impostajump_timer = JUMP_BUFFERinvece di saltare. - A ogni fotogramma, prima della gravità: quando
jump_timer > 0eon_ground, impostavel_y = JUMPejump_timer = 0. Poi, sejump_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()
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Mondi
1Mappe dal testo
Un livello in testoRighe e colonneLettere con significatoDove inizia il giocatoreUna schermata alla volta4Collisioni con le piattaforme
Muri a sinistra e a destraAtterrare sulle piattaformeBattere la testaCadere fuori dal livelloUn asse alla volta5Una telecamera a scorrimento
Un offset della telecameraSegui il giocatoreMantieni la telecamera all'internoParallasse3Gravità e salto
Cadere con la gravitàSaltare da terraSaltelli breviUna velocità massima di cadutaBuffer del saltoEsercitati da solo: Playground Pygame