FPS는 초당 프레임 수를 의미한다. 보통은 30~60 정도로 설정하는데 프레임 수가 높으면, 화면이나 캐릭터 이동이 끊기지 않고 자연스럽다. 대신 더 많은 CPU 메모리를 사용하게 된다. 반면, 프레임 수가 낮으면 움직임이 부자연스럽고 끊기는 느낌이 나지만 CPU 메모리는 적게 사용하게 된다.
FPS는 테트리스를 만들면서도 많이 고민했던 부분인데, 시간이 지남에 따라 블록이 내려오는 과정을 구현해야하다보니 그랬던 것 같다. 기본적으로 사람의 눈에는 블록이 내려오는 것처럼 보이지만, 컴퓨터의 입장에서 보면 블록을 지웠다가 조금 밑에 다시 생성하고, 또 지우고 생성하는 과정을 반복하는 것이다. 결국은 일종의 착시 또는 눈속임인데, 애니메이션의 작동원리와 비슷하다.
코드만 요약해서 적으면 아래와 같은데, 하나하나 살펴보도록 하자.
clock = pygame.time.Clock()
FPS = 30
dt = clock.tick(FPS)
print(f"FPS : {str(clock.get_fps())}")
▷ clock = pygame.time.Clock()
pygame.time.Clock 모듈 안에는 다양한 함수들이 선언되어 있다. 우리는 이 중에서 tick이라는 함수를 사용할 건데, 사용을 좀 더 편리하기 위해서 이 모듈 자체를 clock으로 미리 선언해둔 것이다.
https://www.pygame.org/docs/ref/time.html#pygame.time.Clock.tick
▷ clock.tick(FPS)
https://www.pygame.org/docs/ref/time.html#pygame.time.Clock.tick
tick() 함수 같은 경우는 시간을 계산해서, 그 시간마다 프레임을 업데이트 해준다. 예를 들어서 tick(40)이라고 하면, 1초 동안 적어도 40회는 프로그램을 돌린다는 뜻이다.
우리가 새로운 프로그램이나, 함수를 사용하게 될 때는 docs 문서를 살펴보면 설명이 자세히 나와있기 때문에, docs 문서를 잘 볼 수 있도록 연습하는 것도 꽤나 중요하다. 그래서 나는 강의를 들으면서도, 모르는 부분은 검색해서 꼭 문서에서 한번씩 찾아본다. 그래야 내 것이 될 수 있으니까.
* 추가
예를 들어서, 캐릭터가 1초 동안에 100만큼 이동한다고 해보자.
만약 10FPS라면, 1초 동안에 10번 동작을 할 것이고, 1번 이동할 때 10만큼 이동을 해야한다.
20FPS라면, 1초 동안에 20번 동작하고, 1번 이동할 때 5만큼 이동하면 될 것이다.
▷ str(clock.get_fps())
현재의 fps 값을 가져오는 함수이다. 프린트 함수로 fps 값을 출력해볼 수 있다. print ( str(clock.get_fps() ))
▷ 전체 코드 _ FPS 설정
#5. FPS 처리
import pygame
pygame.init()
screen_width = 480
screen_height = 640
screen = pygame.display.set_mode((screen_width, screen_height))
# FPS 설정1
clock = pygame.time.Clock()
pygame.display.set_caption("Let's make game")
background = pygame.image.load("C:/Users/Soyoung/Desktop/pygame/background.png")
character = pygame.image.load("C:/Users/Soyoung/Desktop/pygame/pika.jpg")
character_size = character.get_rect().size
character_width = character_size[0]
character_height = character_size[1]
character_x_pos = (screen_width/2) - (character_width/2)
character_y_pos = screen_height - character_height
to_x =0
to_y = 0
running = True
while running:
# FPS 설정2
# 게임 화면의 초당 프레임 수를 30으로 설정함
FPS = 30
dt = clock.tick(FPS)
# 이렇게 하면 출력값으로 FPS를 확인할 수 있다.
print(f"FPS : {str(clock.get_fps())}")
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# FPS 설정까지 마치니까 이동이 느려져서 간격을 5로 바꾸었다.
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
to_x -= 5
elif event.key == pygame.K_RIGHT:
to_x += 5
elif event.key == pygame.K_UP:
to_y -= 5
elif event.key == pygame.K_DOWN:
to_y += 5
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
to_x = 0
elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
to_y = 0
character_x_pos += to_x
character_y_pos += to_y
if character_x_pos < 0:
character_x_pos = 0
elif character_x_pos > screen_width - character_width:
character_x_pos = screen_width - character_width
if character_y_pos < 0:
character_y_pos = 0
elif character_y_pos > screen_height - character_height:
character_y_pos = screen_height - character_height
screen.blit(background, (0,0))
screen.blit(character,(character_x_pos, character_y_pos))
pygame.display.update()
pygame.quit()
▷ 참고 자료
pygame : https://www.pygame.org/docs
'python으로 게임 만들기 > pygame' 카테고리의 다른 글
[pygame] 7. 충돌 처리를 위한 준비 (0) | 2024.02.24 |
---|---|
[pygame] 6. FPS 설정2 (0) | 2024.02.24 |
[pygame] 4. 배경화면 경계선 처리 (0) | 2024.02.24 |
[pygame] 3. 키보드 이벤트 (0) | 2024.02.24 |
[pygame] 2. 배경화면과 캐릭터 설정 (0) | 2024.02.24 |