게임을 조금이라도 아신다면 프레임이라는 말을 다들 아실 겁니다. 파이게임에서의 프레임 설정에 대해 간단히 써보겠습니다.
프레임 설정은 pygame.time 클래스를 이용합니다. 이 클래스에는 delay, wait 등의 함수와 정해진 시간에 이벤트 메시지를 보내주는 set_timer 등의 함수가 있습니다만 이들 함수는 설명을 읽어보면 사용법을 간단히 알 수 있고 프레임 설정과는 관계없는 함수들이니 관심있으신 분들은 읽어 보시고요.
>
프레임 설정관련 함수는 pygame.time.Clock() 클래스에 있습니다.
사용하기 위해선 일단 새 오브젝트를 생성합니다.
clock = pygame.time.Clock()
그런 뒤에 게임 루프 안에 다음의 함수를 추가 합니다.
clock.tick(FPS)
와 같은 방식으로 사용하면 됩니다. FPS 는 원하는 프레임 값입니다.
tick 외에 tick_busy_loop 함수도 있습니다.
똑같이
clock.tick_busy_loop(FPS)
방식으로 사용하면 됩니다.
두 함수의 차이는 메뉴얼에 따르면 정확도와 CPU 자원의 소모에 있습니다. tick() 함수는 CPU 를 적게 먹는대신 정확도가 떨어지고 , tick_busy_loop 는 CPU 자원을 더 소모하는 대신 정확도가 더 높습니다.
하지만 특별히 타이밍이 아주 정확해야 하는 특별한 게임이 아니라면, 그 정확도가 크게 눈에 띄일 정도가 아니기 때문에 tick() 함수 정도로도 큰 문제는 없습니다.
tick() 과 tick_busy_loop() 함수는 주어진 FPS 값을 넘지 않도록 딜레이를 주는 방식으로 프레임을 제한 합니다.
tick() 과 tick_busy_loop() 함수는 리턴값으로 현재의 tick() 함수 호출과 이전 tick() 함수가 호출된 사이의 시간을 milliseconds 단위로 리턴 합니다.
이 리턴된 값을 이용하면 프레임이 일정하지 않다거나, 게임을 60 프레임으로 작성하다 30 프레임으로 변경한다던가 하는 경우에도 게임이 항상 일정한 속도로 실행되도록 만들수가 있습니다만....자세한 설명은 생략하겠습니다. 굳이 그렇게 할 필요가 있나...라는 생각도 들기도 하고요.
FPS = 60
clock = pygame.time.Clock()
done = True
#게임의 메인루프
while done:
ev = pygame.event.get()
for event in ev:
if event.type ==pygame.QUIT: #창의 종료버튼이 눌렸을때 게임종료
done = False
if event.type == pygame.MOUSEMOTION: #마우스의 위치 얻음
bar.rect.center = (pygame.mouse.get_pos()[0],700)
break
print(f"tick:{clock.tick(FPS)} fps:{clock.get_fps()}") #프레임 설정 부분
background.blit(bar.image,bar.rect) #bar 스프라이트를 그림
background.blit(ball.image,ball.rect)
background.blit(text,(870,20))
screen.blit(background,(0,0)) #background 를 screen 에 복사해 줌
pygame.display.flip() #화면 갱신
대략 다른 부분을 생략한 메인 루프 부분 입니다. '#프레임 설정부분' 이라고 쓰인곳에 코드가 있습니다. 위에서는 프레임을 설정해 줌과 동시에 현재 프레임을 프린트 하도록 되어 있습니다.
위에 쓰인'clock.get_fps()' 함수가 현재의 프레임 값을 리턴해 줍니다. 처음에는 '0' 이 출력되나, tick() 함수가 10번 정도 호출된 이후부터는 프레임이 계산되어 출력됩니다.
제가 FPS 값을 60 을 주고 프레임을 보니 61.xxxxx ~ 62.5 사이의 값들이 출력되더군요. 정확하게 60 프레임 값이 출력되지는 않았습니다.
실제로 테스트 해 보시면 아시겠지만...위에서 설명했듯이 tick() 함수는 주어진 FPS 값을 넘지 않기 위해 딜레이를 주는 함수입니다. 따라서 FPS 값을 낮추면 낮출수록 게임의 속도는 느려집니다.
'프로그래밍 > python' 카테고리의 다른 글
pygame 벽돌깨기 게임 프로젝트 - Vector2 클래스를 이용한 공의 이동 (0) | 2020.10.22 |
---|---|
자료형을 파일로 저장하는 방법 (0) | 2020.07.17 |
pygame 에서의 사운드 출력 (0) | 2019.11.04 |
벽돌깨기 게임 프로젝트 4 - 공의 반사각도 변경하기 (2) | 2019.08.05 |
pygame 에서 텍스트 출력 (0) | 2019.07.08 |