반응형

게임을 조금이라도 아신다면 프레임이라는 말을 다들 아실 겁니다. 파이게임에서의 프레임 설정에 대해 간단히 써보겠습니다.

 

프레임 설정은 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 값을 낮추면 낮출수록 게임의 속도는 느려집니다.

 

 

+ Recent posts