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.
Aufgabe
Einfach- Füge oben
MAX_FALL = 12hinzu. - Ersetze
vel_y += GRAVITYdurchvel_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
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