Menu
CoddyTech

Ein Kamera-Offset

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

Dieses Level ist 48 Kacheln breit, also drei Fenster. Alles behält seine Position im Level, und eine Kamera entscheidet, welcher Teil des Levels im Fenster angezeigt wird. Die Kamera ist eine Zahl, camera_x: die x-Position im Level am linken Rand des Fensters.

Um etwas zu zeichnen, ziehst du die Kamera von seiner x-Position im Level ab:

for wall in walls:
    screen.blit(block_img, (wall.x - camera_x, wall.y))
screen.blit(player_img, (player.x - camera_x, player.y))

Mit camera_x = 0 siehst du den Anfang. Mit camera_x = 600 wird eine Wand bei x = 800 an Position 200 gezeichnet. Nur das Zeichnen ändert sich: Die Rects in walls und player behalten ihre Positionen im Level, sodass Kollisionen wie zuvor funktionieren.

In diesem Programm driftet die Kamera von selbst mit 2 Pixeln pro Frame nach rechts, bis sie das Ende des Levels zeigt. Das Startprogramm verändert camera_x, zeichnet aber ohne diesen Wert, sodass sich nichts bewegt.

challenge icon

Aufgabe

Einfach
  1. Zeichne jede Wand bei (wall.x - camera_x, wall.y).
  2. Zeichne den Spieler bei (player.x - camera_x, player.y).

Lass die Drift so, wie sie ist: Das Level sollte von selbst nach links gleiten.

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, wall.y))
    screen.blit(player_img, (player.x, player.y))
    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