Menu
CoddyTech

Sprungpuffer

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

Spieler drücken die Sprungtaste, wenn sie die bevorstehende Landung sehen, oft ein paar Frames zu früh. Mit dem Sprung im KEYDOWN-Ereignis befindet sich der Spieler bei diesem Tastendruck in der Luft, und der Tastendruck geht verloren. Der Spieler hat das Gefühl, dass das Spiel ihn ignoriert hat.

Ein Sprungpuffer merkt sich den Tastendruck für ein paar Frames. Das Ereignis startet lediglich einen Timer:

elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
    jump_timer = JUMP_BUFFER

Springe in jedem Frame vor der Schwerkraft, wenn der Timer noch läuft und der Spieler auf dem Boden ist, und zähle den Timer herunter:

if jump_timer > 0 and on_ground:
    vel_y = JUMP
    jump_timer = 0
if jump_timer > 0:
    jump_timer -= 1

Mit JUMP_BUFFER = 6 zählt ein Tastendruck 6 Frames lang, also ein Zehntel einer Sekunde: lang genug, um einen frühzeitigen Tastendruck abzufangen, aber kurz genug, damit ein Tastendruck lange vor der Landung nicht überraschend einen Sprung auslöst. Ein Tastendruck am Boden löst den Sprung weiterhin im nächsten Frame aus.

challenge icon

Aufgabe

Schwer
  1. Füge JUMP_BUFFER = 6 oben und jump_timer = 0 vor der Schleife hinzu.
  2. Setze bei einem KEYDOWN für die Leertaste oder die Pfeiltaste nach oben jump_timer = JUMP_BUFFER, anstatt zu springen.
  3. Setze in jedem Frame vor der Schwerkraft, wenn jump_timer > 0 und on_ground gilt, vel_y = JUMP und jump_timer = 0. Ziehe danach 1 davon ab, wenn jump_timer > 0 gilt.

Probier es selbst

import pygame

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

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Jump Buffer")
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 = min(vel_y + GRAVITY, MAX_FALL)
    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()
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Spielwelten

Übe selbstständig: Pygame-Playground