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 // 2Titik 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.
Tantangan
Mudah- Hilangkan pergeseran.
- Setelah tabrakan, atur
camera_x = player.centerx - WIDTH // 2setiap 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
1Peta dari Teks
Level dalam TeksBaris dan KolomHuruf yang Memiliki MaknaTempat Pemain MemulaiSatu Layar Setiap KaliLatihan sendiri: Playground Pygame