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 -= 1Avec 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.
Défi
Difficile- Ajoute
JUMP_BUFFER = 6en haut etjump_timer = 0avant la boucle. - Lors d’un
KEYDOWNsur la barre d’espace ou la flèche haut, définisjump_timer = JUMP_BUFFERau lieu de sauter. - À chaque image, avant la gravité : lorsque
jump_timer > 0et queon_groundest vrai, définisvel_y = JUMPetjump_timer = 0. Ensuite, sijump_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()
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
1Des cartes à partir de texte
Un niveau en texteLignes et colonnesDes lettres qui ont un sensOù commence le joueurUn écran à la fois4Collisions avec les plateformes
Murs à gauche et à droiteAtterrir sur les plateformesSe cogner la têteTomber hors du niveauUn axe à la fois3Gravité et saut
Tomber avec la gravitéSauter depuis le solPetits sautsUne vitesse de chute maximaleTampon de saut6Des ennemis en patrouille
Un blob en patrouilleÉcraser ou se faire toucherUn cycle de marcheDes ennemis issus de la carteEntraînez-vous par vous-même : Playground Pygame