Menu
CoddyTech

Une vitesse de chute maximale

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

La gravité continue d’augmenter la vitesse de chute. Si le joueur tombe d’assez haut, il parcourt 30 ou 40 pixels en une image. Une tuile mesure 36 pixels de haut ; à cette vitesse, le joueur peut donc traverser une plateforme entre deux images sans jamais entrer en collision avec elle.

Les chutes réelles ont aussi une vitesse maximale. Limite la vitesse avec min :

MAX_FALL = 12
# dans la boucle
vel_y = min(vel_y + GRAVITY, MAX_FALL)

min renvoie le plus petit de ses deux nombres, donc la vitesse augmente de 1 par image jusqu’à atteindre 12, puis reste à cette valeur. Un saut commence à -15, en dessous de cette limite, donc les sauts ne changent pas.

Douze correspond au tiers d’une tuile : quel que soit l’objet sur lequel le joueur tombe, il y aura une image où il entre en collision avec lui, et le test d’atterrissage pourra le détecter.

challenge icon

Défi

Facile
  1. Ajoute MAX_FALL = 12 en haut.
  2. Remplace vel_y += GRAVITY par vel_y = min(vel_y + GRAVITY, MAX_FALL).

Le joueur commence dans les airs, afin que tu puisses le voir atteindre la vitesse maximale.

Essayez vous-même

import pygame

TILE = 36
FLOOR = 324
GRAVITY = 1
JUMP = -15

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

Toutes les leçons de Les mondes

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