Menu
CoddyTech

Vom Boden springen

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

Ein Sprung ist eine negative Geschwindigkeit. Setze vel_y = -15, und der Spieler bewegt sich 15 Pixel nach oben; die Schwerkraft zieht in jedem Frame 1 ab, bis er wieder fällt. Dadurch entsteht der Bogen.

Ein Sprung sollte nur vom Boden aus beginnen. Verwende ein Flag, das angibt, ob der Spieler in diesem Frame auf dem Boden stand:

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

Verwende das KEYDOWN-Ereignis für den Sprung, damit ein Tastendruck einem Sprung entspricht, unabhängig davon, ob die Taste gehalten wird oder nicht:

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) ist für beide Tasten True. In der Luft ist on_ground False, daher bewirkt ein zweiter Tastendruck nichts.

challenge icon

Aufgabe

Mittel
  1. Füge oben JUMP = -15 und vor der Spielschleife on_ground = False ein.
  2. Setze in jedem Frame vor der Bodenprüfung on_ground = False und innerhalb der Prüfung on_ground = True.
  3. Setze bei einem KEYDOWN von Leertaste oder Pfeil nach oben, wenn on_ground True ist, vel_y = JUMP.

Probier es selbst

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

Alle Lektionen in Spielwelten

Übe selbstständig: Pygame-Playground