Jaga Kamera Tetap di Dalam Batas
Termasuk bagian Dunia Game dalam perjalanan Pygame di Coddy. Pelajaran 22 dari 35.
Kamera yang selalu memusatkan pemain akan menampilkan langit di sebelah kiri level saat mulai, dan hal yang sama setelah melewati ujungnya. Jaga agar kamera tetap berada di antara tepi level.
Posisi kamera paling kecil adalah 0: jendela dimulai dari tepi kiri level. Posisi paling besar adalah level_width - WIDTH: tepi kanan jendela berada di tepi kanan level. Batasi posisinya setelah mengikuti pemain:
camera_x = player.centerx - WIDTH // 2
camera_x = max(0, min(camera_x, level_width - WIDTH))min menurunkan posisi kamera yang terlalu jauh ke kanan; max menaikkan posisi kamera yang terlalu jauh ke kiri. Di tengah level, keduanya tidak mengubah apa pun dan kamera tetap mengikuti pemain seperti sebelumnya. Di dekat ujung level, kamera berhenti dan pemain berjalan menuju tepi jendela. Begitulah perilaku kebanyakan game dengan tampilan gulir samping.
Tantangan
Mudah- Setelah
camera_x = player.centerx - WIDTH // 2, batasi nilainya:camera_x = max(0, min(camera_x, level_width - WIDTH)).
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
camera_x = player.centerx - WIDTH // 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()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Dunia Game
1Peta dari Teks
Level dalam TeksBaris dan KolomHuruf yang Memiliki MaknaTempat Pemain MemulaiSatu Layar Setiap KaliLatihan sendiri: Playground Pygame