Menu
CoddyTech

Sauter depuis le sol

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

Un saut correspond à une vitesse négative. Définis vel_y = -15 et le joueur se déplace vers le haut de 15 pixels ; la gravité réduit cette valeur de 1 à chaque image jusqu'à ce qu'il retombe. Cela donne la trajectoire en arc.

Un saut ne doit commencer que depuis le sol. Garde un indicateur qui précise si le joueur se trouvait au sol pendant cette image :

vel_y += GRAVITY
player.y += vel_y
on_ground = False
if player.bottom > FLOOR:
    player.bottom = FLOOR
    vel_y = 0
    on_ground = True

Utilise l'événement KEYDOWN pour le saut, afin qu'une pression déclenche un seul saut, que la touche soit maintenue ou non :

elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
    if on_ground:
        vel_y = JUMP

event.key in (pygame.K_SPACE, pygame.K_UP) vaut True pour l'une ou l'autre touche. En l'air, on_ground vaut False, donc une deuxième pression ne fait rien.

challenge icon

Défi

Moyen
  1. Ajoute JUMP = -15 en haut et on_ground = False avant la boucle du jeu.
  2. À chaque image, définis on_ground = False avant le test du sol et on_ground = True à l’intérieur de celui-ci.
  3. Lors d’un KEYDOWN sur Espace ou la flèche Haut, lorsque on_ground vaut True, définis vel_y = JUMP.

Essayez vous-même

import pygame

TILE = 36
FLOOR = 324
GRAVITY = 1

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Gravity")
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

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 4
    if keys[pygame.K_RIGHT]:
        player.x += 4

    vel_y += GRAVITY
    player.y += vel_y
    if player.bottom > FLOOR:
        player.bottom = FLOOR
        vel_y = 0

    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()

Toutes les leçons de Les mondes

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