Menu
CoddyTech

Maksymalna prędkość spadania

Część sekcji Światy ścieżki Pygame w Coddy. Lekcja 13 z 35.

Grawitacja cały czas zwiększa prędkość spadania. Jeśli gracz spadnie z wystarczająco dużej wysokości, w jednej klatce pokona 30 lub 40 pikseli. Kafelek ma 36 pikseli wysokości, więc przy takiej prędkości gracz może przelecieć prosto przez platformę między dwiema klatkami, nigdy jej nie dotykając.

Rzeczywiste spadanie również ma prędkość maksymalną. Ogranicz prędkość za pomocą min:

MAX_FALL = 12
# w pętli
vel_y = min(vel_y + GRAVITY, MAX_FALL)

min zwraca mniejszą z dwóch liczb, więc prędkość rośnie o 1 w każdej klatce, aż osiągnie 12, a potem pozostaje na tym poziomie. Skok zaczyna się od -15, poniżej limitu, więc skoki się nie zmieniają.

Dwanaście to jedna trzecia wysokości kafelka: niezależnie od tego, na co spadnie gracz, w którejś klatce nastąpi nałożenie się na ten obiekt, a test lądowania może to wykryć.

challenge icon

Wyzwanie

Łatwy
  1. Dodaj MAX_FALL = 12 na górze.
  2. Zastąp vel_y += GRAVITY przez vel_y = min(vel_y + GRAVITY, MAX_FALL).

Gracz zaczyna w powietrzu, więc możesz zobaczyć, jak osiąga maksymalną prędkość.

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji Światy

Poćwicz samodzielnie: Edytor online Pygame