시간으로 애니메이션 만들기
Coddy Pygame 여정의 스프라이트와 이미지 섹션에 포함된 레슨. 36개 중 27번째.
프레임 카운터는 애니메이션을 프레임 속도에 맞춥니다. 초당 30프레임만 처리하는 컴퓨터에서는 벌레의 날갯짓이 절반 속도로 움직입니다. 대신 시간에 맞추세요.
pygame.time.get_ticks()는 pygame.init() 이후 경과한 밀리초 수입니다. 각 그림을 표시할 시간을 기준으로 나누면 지금까지 표시된 그림 수를 알 수 있고, %를 사용하면 이를 인덱스로 바꿀 수 있습니다.
frame_index = pygame.time.get_ticks() // 120 % len(frames)0~119ms 동안은 그림 0, 120~239ms 동안은 그림 1, 그다음에는 그림 2, 다시 그림 0입니다. 유지하고 초기화할 카운터가 필요 없습니다. 한 줄로 매 프레임 새로 계산하면 됩니다. 게임이 느려지면 애니메이션도 함께 느려지는 대신 그림 하나를 건너뜁니다.
//는 나눗셈을 하고 나머지를 버립니다. 즉, 250 // 120은 2입니다. 이 스프라이트 시트의 세 번째 행에는 세 가지 자세로 날아가는 벌레가 있으며, 6~8열은 이미 frames로 잘라져 있습니다.
챌린지
중급timer와 카운터를 제거하세요.- 매 프레임마다
pygame.time.get_ticks()를 사용해frame_index를 설정하여 세 그림이 순서대로 각각 120밀리초 동안 표시되도록 하세요.
직접 해보기
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Flying Bug")
clock = pygame.time.Clock()
sheet = pygame.image.load("assets/sheets/platformer_characters.png").convert_alpha()
frames = []
for col in (6, 7, 8):
frame = sheet.subsurface((col * 24, 48, 24, 24))
frames.append(pygame.transform.scale_by(frame, 3))
frame_index = 0
timer = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
timer += 1
if timer == 10:
timer = 0
frame_index = (frame_index + 1) % len(frames)
screen.fill((20, 22, 40))
image = frames[frame_index]
screen.blit(image, image.get_rect(center=(320, 240)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
스프라이트와 이미지의 모든 레슨
직접 연습해 보세요: Pygame 플레이그라운드