Menu
CoddyTech

Eine maximale Fallgeschwindigkeit

Teil des Abschnitts Spielwelten der Pygame-Journey von Coddy. Lektion 13 von 35.

Die Schwerkraft erhöht ständig die Fallgeschwindigkeit. Fällt die Spielfigur aus großer Höhe, bewegt sie sich pro Frame um 30 oder 40 Pixel. Ein Kachel ist 36 Pixel hoch. Bei dieser Geschwindigkeit kann die Spielfigur zwischen zwei Frames direkt durch eine Plattform hindurchfallen, ohne sie jemals zu überlappen.

Auch beim freien Fall gibt es eine Höchstgeschwindigkeit. Begrenze die Geschwindigkeit mit min:

MAX_FALL = 12
# in der Schleife
vel_y = min(vel_y + GRAVITY, MAX_FALL)

min gibt die kleinere der beiden Zahlen zurück. Daher steigt die Geschwindigkeit pro Frame um 1, bis sie 12 erreicht, und bleibt dann konstant. Ein Sprung beginnt bei -15, also unterhalb der Begrenzung; Sprünge ändern sich deshalb nicht.

Zwölf ist ein Drittel einer Kachel: Egal, worauf die Spielfigur fällt, in einem Frame überlappt sie es, und die Landungsprüfung kann es erkennen.

challenge icon

Aufgabe

Einfach
  1. Füge oben MAX_FALL = 12 hinzu.
  2. Ersetze vel_y += GRAVITY durch vel_y = min(vel_y + GRAVITY, MAX_FALL).

Der Spieler beginnt in der Luft, sodass du sehen kannst, wie er die Höchstgeschwindigkeit erreicht.

Probier es selbst

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

Alle Lektionen in Spielwelten

Übe selbstständig: Pygame-Playground