Menu
CoddyTech

Wände links und rechts

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

Die Blöcke werden gezeichnet, aber der Spieler läuft durch sie hindurch. Eine Wand muss den Spieler aufhalten. Bewege ihn zuerst und korrigiere dann die Bewegung: Wenn sich der Spieler nun mit einer Wand überschneidet, schiebe ihn auf der Seite, von der er gekommen ist, wieder heraus.

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

dx ist die seitliche Bewegung in diesem Frame: positiv bedeutet nach rechts. Bewegt sich der Spieler nach rechts, trifft er auf die linke Seite der Wand, also kommt seine rechte Kante dorthin. Bewegt er sich nach links, kommt seine linke Kante an die rechte Seite der Wand.

Die Karte ist in walls eingebaut, einer Liste von Rects, genauso wie in „Maps from Text“. Der Boden ist weiterhin die Linie bei FLOOR, und der Spieler kann weiterhin auf einen Block fallen: Als Nächstes geht es um das Landen auf Wänden.

challenge icon

Aufgabe

Mittel
  1. Gehe nach player.x += dx die walls durch.
  2. Für jede Wand, mit der der Spieler kollidiert: Wenn dx > 0, setze player.right = wall.left; wenn dx < 0, setze player.left = wall.right.

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("Walls")
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

    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()

Alle Lektionen in Spielwelten

Übe selbstständig: Pygame-Playground