시작하기 앞서 이전 내용을 꼭 공부한 후 봐주시길 바랍니다.
FPS 란?
FPS 란 Frames Per Second 의 약자로 초당 프레임 수를 의미합니다. 프레임 수가 높을수록 화면이 더 부드럽고 낮으면 끊기는 듯한 느낌을 받게 됩니다.
FPS 설정
FPS 를 설정하기 위해서 이전에 만들어둔 화면 타이틀 설정 밑부분에 코드를 작성해주도록 하겠습니다.
# FPS
clock = pygame.time.Clock()
clock 이란 변수에 pygame.time.Clock() 함수를 넣어주도록 하겠습니다.
이후 이벤트 루프의 while running: 밑부분에 다른 코드를 작성해주도록 하겠습니다.
dt = clock.tick(60) # 게임화면의 초당 프레임 수를 설정
clock.tick() 의 괄호 안에 있는 숫자는 프레임을 뜻하며 위의 코드대로 한다면 현재 게임이 실행되고서 게임이 60 FPS 를 가지고 있는 것을 뜻하게 됩니다.
FPS 확인
위에서 60FPS 를 설정을 해주었지만 만약에라도 잘못되었을 수 있으니 바로 밑에 확인을 할 수 있는 코드를 작성해주도록 하겠습니다.
print("fps : " + str(clock.get_fps())) # 프레임 확인
이렇게 작성을 해준 후 실행을 해준다면 터미널 창에 58~59 정도의 프레임이 잡히는 것을 확인할 수 있습니다.
해당 코드는 게임에 직접적인 영향을 미치는 코드가 아니기 때문에 주석처리를 해주거나 지워주도록 하겠습니다.
실행 결과
만약 이대로 하고서 실행을 한다면 게임 캐릭터가 원활하게 움직이는 것을 확인할 수 있지만 dt = clock.tick() 의 괄호 안에 10 과 같은 낮은 값들이 들어간다면 게임 캐릭터가 버벅이는 현상을 확인할 수 있습니다. 그 이유는 다음과 같습니다.
캐릭터가 만약 1초 동안에 100 만큼 이동을 해야 할 경우를 예시로 잡도록 하겠습니다.
FPS 가 10 일 경우 1초 동안에 10 번을 동작을 하는 것과 같으며 1번에 10만큼 10번 동작을 해야합니다.
FPS 가 20 일 경우 1초 동안에 20 번을 동작을 하는 것과 같으며 1번에 20만큼 5번 동작을 해야합니다.
FPS 는 이러한 형식으로 작동을 하는데 이벤트 루프에 해당하는 코드를 확인해보면
# 키보드 방향키의 눌림과 눌릴 때 위치 설정
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
이와 같이 키보드가 눌리면 무조건 적으로 5만큼씩 이동하게끔 되어있어 그러한 현상이 발생하는 것이고 이러한 현상을 방지하기 위해서 우리는 코드를 수정해주어야 합니다.
이동 속도 설정
이전에 만들어둔 이동할 좌표의 밑부분에 아래 코드를 작성해주도록 하겠습니다.
# 이동 속도
character_speed = 0.6
character_speed = 0.6 이라는 값을 가지게 되며 변수가 설정됩니다. 이것을 이벤트 루프 부분에 존재하는 to_x -= 5, to_y -= 5, 등 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
뿐만 아니라 이전에 설정해준 character_x_pos += to_x 와 character_y_pos += to_y 에 각각 dt 를 곱해주어야합니다.
왜냐하면 FPS 가 바뀐다고 하더라도 게임 내 자체 속도가 달라지면 안되기 때문입니다.
character_x_pos += to_x * dt
character_y_pos += to_y * dt
설정을 이렇게 해주고서 게임을 실행을 해준다면 원활하게 돌아가는 것을 확인할 수 있습니다.
또한, FPS 를 60 이 아니라 30, 20, 10, 100 등 어떠한 값이 들어가도 캐릭터의 움직임이 뻣뻣하거나 부드러워 질 수는 있지만 속도만큼은 유지되는걸 확인할 수 있습니다.
현재까지 완성된 진행 상황, 진행 코드 확인
지금까지 배경설정, 캐릭터 생성, 키보드 입력 받기, FPS 설정 을 하였습니다. 다음 과정에서는 적의 이미지를 생성하고서 충돌 처리를 만들도록 하겠습니다.
다음은 지금까지 진행된 코드의 상황입니다.
import pygame
pygame.init() # 초기화 (반드시 필요)
# 화면 크기 설정
screen_width = 480 # 가로 크기
screen_height = 640 # 세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))
# 화면 타이틀 설정
pygame.display.set_caption("Cheong Game") # 게임 이름
# FPS
clock = pygame.time.Clock()
# 배경 이미지 불러오기
background = pygame.image.load("D:\\Study\\PythonWorkspace\\game\\background.png") # \\ 말고 / 로도 가능
# 스프라이트(캐릭터) 불러오기
character = pygame.image.load("D:\\Study\\PythonWorkspace\\game\\character.png")
characte_size = character.get_rect().size # 이미지의 크기를 구해옴
character_width = characte_size[0] # 캐릭터 가로 크기
character_height = characte_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.6
# 이벤트 루프
running = True # 게임이 진행중인가?
while running:
dt = clock.tick(60) # 게임화면의 초당 프레임 수를 설정
# print("fps : " + str(clock.get_fps())) # 프레임 확인
for event in pygame.event.get(): # 어떤 이벤트가 발생하였는가?
if event.type == pygame.QUIT: # 창이 닫히는 이벤트가 발생하였는가?
running = False # 게임이 진행중이 아님
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
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 종료
pygame.quit()
'Project > 충돌, 피하기 게임' 카테고리의 다른 글
[Pygame] 텍스트 설정 (0) | 2022.06.01 |
---|---|
[Pygame] 적 생성하기, 충돌 처리 (0) | 2022.05.29 |
[Pygame] 키보드 이벤트 (0) | 2022.05.27 |
[Pygame] 캐릭터 만들기 (0) | 2022.05.26 |
[Pygame] 배경 설정 (0) | 2022.05.24 |