Menu
CoddyTech

Dem Spieler folgen

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

Eine driftende Kamera lässt den Spieler zurück. Setze stattdessen in jedem Frame die Kamera anhand des Spielers, nachdem sich der Spieler bewegt hat:

camera_x = player.centerx - WIDTH // 2

Die Mitte des Fensters liegt bei WIDTH // 2, also 288 Pixel vom linken Rand entfernt. Befindet sich die Kamera 288 Pixel links von der Mitte des Spielers, wird der Spieler in der Mitte des Fensters gezeichnet. Gehst du nach rechts, gleitet das Level unter einem Spieler, der auf dem Bildschirm stehen bleibt, nach links.

Setze die Kamera nach den Kollisionen, damit sie die Position des Spielers verwendet, die er in diesem Frame erreicht hat, und nicht die Position davor. Zu Beginn zeigt das Fenster links vom Level leeren Raum: Die nächste Lektion behebt das.

challenge icon

Aufgabe

Einfach
  1. Entferne die Drift.
  2. Setze nach den Kollisionen in jedem Frame camera_x = player.centerx - WIDTH // 2.

Probier es selbst

import pygame

TILE = 36
WIDTH = 576
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12

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

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

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)

level_width = len(LEVEL[0]) * TILE
player = player_img.get_rect(midbottom=start)
vel_y = 0
on_ground = False
camera_x = 0

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
    for wall in walls:
        if player.colliderect(wall):
            if vel_y > 0:
                player.bottom = wall.top
                on_ground = True
            elif vel_y < 0:
                player.top = wall.bottom
            vel_y = 0

    if camera_x < level_width - WIDTH:
        camera_x += 2

    screen.fill((140, 200, 240))
    for wall in walls:
        screen.blit(block_img, (wall.x - camera_x, wall.y))
    screen.blit(player_img, (player.x - camera_x, player.y))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Alle Lektionen in Spielwelten

Übe selbstständig: Pygame-Playground