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_BUFFERSpringe 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 -= 1Mit 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.
Aufgabe
Schwer- Füge
JUMP_BUFFER = 6oben undjump_timer = 0vor der Schleife hinzu. - Setze bei einem
KEYDOWNfür die Leertaste oder die Pfeiltaste nach obenjump_timer = JUMP_BUFFER, anstatt zu springen. - Setze in jedem Frame vor der Schwerkraft, wenn
jump_timer > 0undon_groundgilt,vel_y = JUMPundjump_timer = 0. Ziehe danach 1 davon ab, wennjump_timer > 0gilt.
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()
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Spielwelten
1Karten aus Text
Ein Level in TextformZeilen und SpaltenBuchstaben mit BedeutungWo der Spieler startetEin Bildschirm nach dem anderen4Kollisionen mit Plattformen
Wände links und rechtsAuf Plattformen landenStoß dir den KopfAus dem Level fallenEine Achse nach der anderen3Schwerkraft und Springen
Fallen mit SchwerkraftVom Boden springenKurze SprüngeEine maximale FallgeschwindigkeitSprungpuffer6Patrouillierende Gegner
Ein patrouillierender BlobDrauftreten oder getroffen werdenEin GehzyklusGegner aus der KarteÜbe selbstständig: Pygame-Playground