부드러운 카메라
Coddy Pygame 여정의 사운드와 게임의 손맛 섹션에 포함된 레슨. 23개 중 17번째.
이 도로 게임에서 카메라는 플레이어에게 고정되어 있습니다. 플레이어가 무엇을 하든 화면 중앙에 머물고, 세계가 플레이어 아래로 미끄러져 움직입니다. 작동은 하지만, 움직이기 시작하거나 멈출 때마다 화면 전체가 덜컹거립니다.
카메라가 원과 같은 이징 효과로 따라오게 해 보세요. 목표 지점은 플레이어가 화면 중앙에 오도록 하는 위치입니다.
camera_x += (player.centerx - 240 - camera_x) * 0.1
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))플레이어는 이전과 같이 움직이고, 화면만 부드럽게 따라옵니다. 플레이어가 달리기 시작하면 카메라가 조금 늦게 따라오므로 플레이어가 화면 중앙보다 앞서 달립니다. 플레이어가 멈추면 카메라는 따라잡으려 부드럽게 움직이고, 다시 플레이어가 가운데에 오도록 멈춥니다. 두 번째 줄은 여전히 카메라가 세계 바깥으로 나가지 않게 합니다.
세계는 이전과 같이 -int(camera_x) 위치에 그려집니다. 이제 camera_x는 소수입니다. int()는 화면에 정수 픽셀 단위로 그리도록 하고, 변수는 다음 프레임을 위해 정확한 값을 유지합니다.
미끄러져 들어오는 메뉴 패널, 줄어드는 체력 바, 올라가는 점수처럼 새로운 값으로 변하는 것은 무엇이든 같은 방식으로 부드럽게 움직일 수 있습니다.
챌린지
중급카메라가 부드럽게 따라오도록 하세요. camera_x = player.centerx - 240를 매 프레임마다 camera_x를 player.centerx - 240 쪽으로 10분의 1만큼 이동시키는 줄로 바꾸세요. 값을 제한하는 줄은 그대로 두세요.
직접 해보기
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Long Road")
clock = pygame.time.Clock()
WORLD_WIDTH = 1440
player = pygame.Rect(220, 240, 40, 40)
camera_x = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.x -= 6
if keys[pygame.K_RIGHT]:
player.x += 6
player.left = max(player.left, 0)
player.right = min(player.right, WORLD_WIDTH)
camera_x = player.centerx - 240
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 80, 100), (0, 280, 480, 80))
for post_x in range(0, WORLD_WIDTH, 120):
pygame.draw.rect(screen, (80, 160, 255), (post_x - int(camera_x), 220, 20, 60))
pygame.draw.rect(screen, (90, 200, 120), player.move(-int(camera_x), 0))
pygame.display.flip()
clock.tick(60)
pygame.quit()
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
사운드와 게임의 손맛의 모든 레슨
직접 연습해 보세요: Pygame 플레이그라운드