Menu
CoddyTech

Offset Kamera

Termasuk bagian Dunia Game dalam perjalanan Pygame di Coddy. Pelajaran 20 dari 35.

Level ini lebarnya 48 ubin, tiga layar. Posisi semuanya di level tetap sama, dan kamera menentukan bagian level yang ditampilkan layar. Kamera adalah satu angka, camera_x: koordinat x level di tepi kiri layar.

Untuk menggambar sesuatu, kurangi koordinat x levelnya dengan kamera:

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

Dengan camera_x = 0, kamu melihat awal level. Dengan camera_x = 600, dinding di x = 800 digambar di posisi 200. Hanya penggambaran yang berubah: Rect di walls dan player tetap pada posisi levelnya, sehingga tabrakan berfungsi seperti sebelumnya.

Dalam program ini, kamera bergerak ke kanan sendiri sejauh 2 piksel per frame, sampai menampilkan akhir level. Program awal menggerakkan camera_x, tetapi menggambar tanpa menggunakannya, jadi tidak ada yang bergerak.

challenge icon

Tantangan

Mudah
  1. Gambar setiap dinding pada (wall.x - camera_x, wall.y).
  2. Gambar pemain pada (player.x - camera_x, player.y).

Biarkan pergeserannya seperti semula: level seharusnya bergerak ke kiri dengan sendirinya.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Dunia Game

Latihan sendiri: Playground Pygame