여기서 이제 문제가 뭐냐,
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()
'python으로 게임 만들기 > pygame' 카테고리의 다른 글
[pygame] 8. 간단한 충돌처리 (0) | 2024.02.24 |
---|---|
[pygame] 7. 충돌 처리를 위한 준비 (0) | 2024.02.24 |
[pygame] 5. FPS 설정1 (0) | 2024.02.24 |
[pygame] 4. 배경화면 경계선 처리 (0) | 2024.02.24 |
[pygame] 3. 키보드 이벤트 (0) | 2024.02.24 |