Menu
CoddyTech

Velocidad máxima de caída

Parte de la sección Mundos del Journey de Pygame de Coddy. Lección 13 de 35.

La gravedad sigue aumentando la velocidad de caída. Si caes desde una altura suficiente, el jugador se mueve 30 o 40 píxeles en un solo fotograma. Una baldosa tiene 36 píxeles de alto, así que a esa velocidad el jugador puede atravesar una plataforma entre dos fotogramas, sin llegar a superponerse con ella.

Las caídas reales también tienen una velocidad máxima. Limita la velocidad con min:

MAX_FALL = 12
# en el bucle
vel_y = min(vel_y + GRAVITY, MAX_FALL)

min devuelve el menor de sus dos números, así que la velocidad aumenta en 1 por fotograma hasta llegar a 12 y después se mantiene ahí. Un salto empieza en -15, por debajo del límite, así que los saltos no cambian.

Doce es un tercio de una baldosa: sea cual sea la superficie sobre la que caiga el jugador, habrá algún fotograma en el que se superponga con ella y la comprobación del aterrizaje podrá detectarlo.

challenge icon

Desafío

Fácil
  1. Añade MAX_FALL = 12 al principio.
  2. Reemplaza vel_y += GRAVITY por vel_y = min(vel_y + GRAVITY, MAX_FALL).

El jugador empieza en el aire, así que puedes verlo alcanzar la velocidad máxima.

Pruébalo tú mismo

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

Todas las lecciones de Mundos

Practica por tu cuenta: Playground de Pygame