Menu
CoddyTech

Ikuti Pemain

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

Kamera yang terus bergeser membuat pemain tertinggal. Sebagai gantinya, atur posisi kamera berdasarkan posisi pemain setiap frame, setelah pemain bergerak:

camera_x = player.centerx - WIDTH // 2

Titik tengah jendela adalah WIDTH // 2, 288 piksel dari tepi kirinya. Dengan kamera berada 288 piksel di sebelah kiri pusat pemain, pemain digambar di tengah jendela. Berjalanlah ke kanan, maka level bergeser ke kiri di bawah pemain yang tetap berada di tempatnya pada layar.

Atur posisi kamera setelah menangani tabrakan, agar posisinya mengikuti posisi akhir pemain pada frame ini, bukan posisi sebelumnya. Pada awalnya, jendela menampilkan ruang kosong di sebelah kiri level. Pelajaran berikutnya akan memperbaikinya.

challenge icon

Tantangan

Mudah
  1. Hilangkan pergeseran.
  2. Setelah tabrakan, atur camera_x = player.centerx - WIDTH // 2 setiap frame.

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 - camera_x, wall.y))
    screen.blit(player_img, (player.x - camera_x, player.y))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Semua pelajaran di Dunia Game

Latihan sendiri: Playground Pygame