Menu
CoddyTech

Auf Plattformen landen

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

Jetzt sollen Wände den Spieler oben halten. Nachdem die Bewegung zur Seite korrigiert ist, bewege ihn entlang der y-Achse und korrigiere diese Bewegung auf dieselbe Weise: Wenn der Spieler beim Fallen eine Wand überlappt, setze seine Füße auf die Oberkante der Wand.

vel_y = min(vel_y + GRAVITY, MAX_FALL)
player.y += vel_y
on_ground = False
for wall in walls:
    if player.colliderect(wall):
        if vel_y > 0:
            player.bottom = wall.top
            vel_y = 0
            on_ground = True

on_ground beginnt jeden Frame mit False und wird nur durch eine Landung zu True. Gehst du über eine Kante hinaus, findet der nächste Frame nichts unter dem Spieler, also fällt er und kann nicht in der Luft springen.

Das ersetzt die Zeile FLOOR: Die unterste Reihe der Karte ist wie jede andere Wand Boden. Die Schwerkraft zieht den Spieler in jedem Frame 1 Pixel in den Boden, und die Landeprüfung hebt ihn wieder an, sodass er stillsteht.

challenge icon

Aufgabe

Mittel
  1. Entferne die Zeilenprüfung FLOOR.
  2. Setze nach player.y += vel_y on_ground = False und durchlaufe anschließend walls.
  3. Für jede Wand, mit der der Spieler kollidiert, während vel_y > 0 gilt: player.bottom = wall.top, vel_y = 0, on_ground = True.

Probier es selbst

import pygame

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

LEVEL = [
    "................",
    "................",
    "................",
    "....P.....###...",
    "................",
    "................",
    "...####.........",
    "............#...",
    "#.......#...#..#",
    "################",
]

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Landing")
clock = pygame.time.Clock()

background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
block_img = pygame.image.load("assets/images/block.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()

walls = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        if char == "#":
            walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))
        elif char == "P":
            start = (col * TILE + TILE // 2, row * TILE + TILE)

player = player_img.get_rect(midbottom=start)
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()
    dx = 0
    if keys[pygame.K_LEFT]:
        dx -= SPEED
    if keys[pygame.K_RIGHT]:
        dx += SPEED

    player.x += dx
    for wall in walls:
        if player.colliderect(wall):
            if dx > 0:
                player.right = wall.left
            elif dx < 0:
                player.left = wall.right

    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 wall in walls:
        screen.blit(block_img, wall)
    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