Menu
CoddyTech

Tampon de saut

Fait partie de la section Les mondes du Journey Pygame de Coddy. Leçon 14 sur 35.

Les joueurs appuient sur la touche de saut lorsqu’ils voient l’atterrissage approcher, souvent quelques images trop tôt. Avec le saut dans l’événement KEYDOWN, cette pression survient alors que le joueur est en l’air et est perdue. Le joueur a l’impression que le jeu ne l’a pas entendu.

Un tampon de saut mémorise la pression pendant quelques images. L’événement ne fait que démarrer un minuteur :

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

À chaque image, avant la gravité, déclenchez le saut si le minuteur est toujours actif et que le joueur est au sol, puis décrémentez le minuteur :

if jump_timer > 0 and on_ground:
    vel_y = JUMP
    jump_timer = 0
if jump_timer > 0:
    jump_timer -= 1

Avec JUMP_BUFFER = 6, une pression est prise en compte pendant 6 images, soit un dixième de seconde : assez longtemps pour prendre en compte une pression anticipée, mais assez peu pour qu’une pression effectuée bien avant l’atterrissage ne déclenche pas un saut par surprise. Une pression au sol déclenche toujours le saut à l’image suivante.

challenge icon

Défi

Difficile
  1. Ajoute JUMP_BUFFER = 6 en haut et jump_timer = 0 avant la boucle.
  2. Lors d’un KEYDOWN sur la barre d’espace ou la flèche haut, définis jump_timer = JUMP_BUFFER au lieu de sauter.
  3. À chaque image, avant la gravité : lorsque jump_timer > 0 et que on_ground est vrai, définis vel_y = JUMP et jump_timer = 0. Ensuite, si jump_timer > 0, soustrais-lui 1.

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Les mondes

Entraînez-vous par vous-même : Playground Pygame