Fallen mit Schwerkraft
Teil des Abschnitts Spielwelten der Pygame-Journey von Coddy. Lektion 10 von 35.
Der Held im Fenster fällt gleichmäßig mit 4 Pixeln pro Frame, wie ein Aufzug. Reale Dinge werden beim Fallen schneller. Speichere die vertikale Geschwindigkeit des Spielers in einer Variable und erhöhe sie in jedem Frame:
vel_y += GRAVITY
player.y += vel_y
if player.bottom > FLOOR:
player.bottom = FLOOR
vel_y = 0vel_y ist die Geschwindigkeit in Pixeln pro Frame; positive Werte bedeuten nach unten. GRAVITY = 1 addiert in jedem Frame eins dazu, sodass der Spieler erst 1, dann 2, dann 3 Pixel fällt und so weiter.
Der Boden ist hier eine Linie bei FLOOR = 324, der Oberkante des Grases. Wenn der Spieler sie überschreitet, setze seinen unteren Rand auf die Linie und halte den Fall an. Im nächsten Kapitel wird diese Linie durch echte Plattformen ersetzt.
Der Spieler ist das Rect des Bildes: player_img.get_rect(topleft=(264, 40)) ist ein 48 mal 48 großes Rect an dieser Stelle, und screen.blit(player_img, player) zeichnet das Bild dort.
Aufgabe
Einfach- Füge oben
GRAVITY = 1und vor der Spielschleifevel_y = 0hinzu. - Addiere in jedem Frame
GRAVITYzuvel_yund anschließendvel_yzuplayer.y, anstattplayer.y += 4. - Wenn
player.bottomFLOORüberschreitet, setzeplayer.bottom = FLOORundvel_y = 0.
Probier es selbst
import pygame
TILE = 36
FLOOR = 324
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))
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
player.y += 4
if player.bottom > FLOOR:
player.bottom = FLOOR
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