python으로 게임 만들기/pygame

[pygame] 6. FPS 설정2

bay07 2024. 2. 24. 09:40

여기서 이제 문제가 뭐냐,

FPS가 초당 프레임 수를 의미하는 거라면 FPS = 10이나 FPS = 60이나 화면이 버벅이는 차이만 있어야하지, FPS에 따라서 캐릭터의 속도 자체가 바뀌면 안된다. 근데 지금 그 문제가 일어나고 있음

 

일단 이 문제를 해결하기 전에 캐릭터 좌표를 변수로 만들어서 먼저 빼보자.

# 이동 속도 
character_speed = 10

# 원래 5로 적었던 부분을 character_speed라는 변수로 바꾸었음.
if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
        to_x -= character_speed
    elif event.key == pygame.K_RIGHT:
        to_x += character_speed
    elif event.key == pygame.K_UP:
        to_y -= character_speed
    elif event.key == pygame.K_DOWN:
        to_y += character_speed

 

dt = clock.tick(FPS)

# 보정을 해주기 위해서 dt의 값을 곱해준다. 
# 그러면 캐릭터의 이동속도가 FPS의 영향을 덜 받게 해줄 수 있음 
character_x_pos += to_x * dt
character_y_pos += to_y * dt

 

뭔가 수학적으로 갑자기 궁금해지니까 , 계산을 한번 해보자. 

그니까 일단 캐릭터의 속도를 똑같이 5로 둔 상태에서, FPS를 60으로 설정했을 때 캐릭터의 속도가 빨라지고 FPS를 10으로 설정했을 때는 캐릭터가 느려진다는 게 문제이다.  그러면 각 FPS 마다의 dt값을 한번 출력해보자. 

 

FPS = 60 일 때, dt는 약 16.5이다. (16~17을 왔다갔다 함)

FPS = 10 일 때, dt는 약 100.5정도이다. (100~100.5를 왔다갔다 함)

그니까 16.5 * 6는 대략 99라서 100.5랑 얼추 비슷하다.  그렇기 때문에 캐릭터의 스피드의 값에 dt를 곱해주면, 값이 상쇄되어서 캐릭터의 이동속도가 FPS의 영향을 덜 받게 되는 것이다. 

 

 

▷ 전체코드 

더보기
#6. FPS 처리 2

import pygame

pygame.init()
screen_width = 480
screen_height = 640
screen = pygame.display.set_mode((screen_width, screen_height))

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 

# 이동 속도 
character_speed = 0.5

running = True
while running:
    FPS = 60
    dt = clock.tick(FPS)
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
             running = False
                
        # 원래 5로 적었던 부분을 character_speed라는 변수로 바꾸었음.
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                to_x -= character_speed
            elif event.key == pygame.K_RIGHT:
                to_x += character_speed
            elif event.key == pygame.K_UP:
                to_y -= character_speed
            elif event.key == pygame.K_DOWN:
                to_y += character_speed

        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

    # 보정을 해주기 위해서 dt의 값을 곱해준다. 
    # 그러면 캐릭터의 이동속도가 FPS의 영향을 덜 받게 해줄 수 있음 
    character_x_pos += to_x * dt
    character_y_pos += to_y * dt

    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

나도 코딩 : https://www.youtube.com/watch?v=Dkx8Pl6QKW0