728x90
시작하기 앞서 이전 내용을 꼭 공부한 후 봐주시길 바랍니다.
폰트 정의하기
텍스트를 사용하기 전에 일단 본트를 정의를 해주어야합니다. 아래 코드를 이벤트 루프가 시작되기 전에 작성해주도록 하겠습니다.
# 폰트 정의
game_font = pygame.font.Font(None, 40) # 폰트 객체 생성 (폰트, 크기)
pygame.font.Font() 라는 함수를 사용하여 (어떤 폰트를 사용할지, 크기) 가 괄호안에 순차적으로 들어갑니다.
None 을 적게 된다면 default(디폴트, 기본) 값이 적용되고 크기는 40으로 지정해주도록 하겠습니다.
시간 만들기
총 시간 정의하기
게임에서 시간이 주어질 경우를 생각하며 만들어보겠습니다. 그러기 위해서는 게임이 시작되었을때 주어질 시간이 필요합니다.
# 총 시간
total_time = 10
이런 식으로 total_time 이라는 변수에 10 이라는 값을 넣어주도록 하겠습니다. 우리는 이 변수로 한정되는 시간을 정의할 것입니다.
시작 시간 계산 하기
시간을 정의하였으면 그 시간에서 점차 빠지거나 더해지는 값을 받아와야합니다.
# 시작 시간
start_ticks = pygame.time.get_ticks() # 현재 tick 을 받아옴
pygame.time.get_ticks() 라는 함수를 이용하여 시작 tick 을 받아오게 됩니다.
시간을 계산하는 방법은 시간을 계산하기 직전에 ticks 값을 받아와 빼는 형식으로 진행되게 됩니다.
이제부터는 인게임 내에 타이머를 집어넣어 주도록 하겠습니다.
타이머 표시하기
이벤트 루프 내 충돌 체크 부분 이후부터 코드를 이어나가도록 하겠습니다.
# 타이머 집어 넣기
# 경과 시간 계산
elapse_time = (pygame.time.get_ticks() - start_ticks) / 1000
# 경과 시간을(ms)을 1000으로 나누어서 초(s) 단위로 표시
timer = game_font.render(str(int(total_time - elapse_time)), True, (255, 255, 255))
# 출력할 글자, True, 글자 색상
screen.blit(timer, (10, 10))
- pygame.time.get_ticks() 를 이용하여 현재의 tick 을 받아오고 미리 지정해둔 start_ticks 즉, 시작 tick 을 받아와줍니다.만약 start_ticks 가 시작된 시간이 1분이고 현재 ticks가 4분이라면 둘을 빼줘 3분이 됩니다. 빼준 값을 1000으로 나누어준 이유는 기본적으로 ticks은 ms 로 표시가 되기 때문에 이것을 나누어줘 1s 즉 초로 바꿔주어야합니다. 그리고 이 값을 elapse_time 이란 변수에 저장해주도록 하겠습니다.
- 이후 timer 라는 변수를 만들어 game_font.render(출력할 글자, True, 글자 색상(RGB 기준)) 이란 함수를 이용할 것입니다.
출력할 글자에 총 시간에서 elapse_time 을 빼내어 줄 것입니다. 그러므로 total_time - elapse_time 이 되며 int 형으로 변환시키는 이유는 ticks이나 time 단위가 0.xx 단위로 내려갈 수 있기 때문에 정수형으로 바꿔주어야합니다. 또한 이렇게 바꿔준 정수형을 다시 문자열로 바꿔주어 화면에 출력해주게됩니다.
2번째 칸은 antialias 를 정의하는 장소인데 이 곳에는 True 를 정의해주면 됩니다.
마지막으로는 RGB 컬러를 토대로 만들어진 곳이며 (빨강, 초록, 파랑) 순서로 높을수록 색이 짙게 나옵니다. - 이제 만들어진 변수를 이용하여 출력을 해주어야합니다.
이전에 배경에 출력해준 것과 같이 sereen.blit 함수를 이용해 timer 라는 변수에 저장된 값을 10, 10 이라는 함수값 위치에 띄워주게 됩니다.
타임 아웃 만들기
10초라는 시간을 만들고 점차 시간이 줄어들다가 0초가 된다면 게임이 꺼지도록 만들어주겠습니다.
# 만약 시간이 0 이하이면 게임 종료
if total_time - elapse_time <= 0:
print("타임아웃")
running = False
총합 시간 - 흘러가는 시간 이 0보다 작거나 같아질때, 터미널 창에 타임아웃 이라는 말과 함께 게임이 꺼지는 코드입니다.
현재까지 완성된 코드 확인
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
# 적 enemy 캐릭터
enemy = pygame.image.load("D:\\Study\\PythonWorkspace\\game\\enemy.png")
enemy_size = enemy.get_rect().size # 이미지의 크기를 구해옴
enemy_width = enemy_size[0] # 캐릭터 가로 크기
enemy_height = enemy_size[1] # 캐릭터 세로 크기
enemy_x_pos = screen_width / 2 - enemy_width / 2 # 화면 가로의 절반 크기에 해당하는 곳에 위치
enemy_y_pos = screen_height / 2 - enemy_height / 2 # 화면 세로 크기 가장 아래에 해당하는 곳에 위치
# 폰트 정의
game_font = pygame.font.Font(None, 40) # 폰트 객체 생성 (폰트, 크기)
# 총 시간
total_time = 10
# 시작 시간
start_ticks = pygame.time.get_ticks() # 현재 tick 을 받아옴
# 이벤트 루프
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
# 충돌 처리를 위한 rect 정보 업데이트
character_rect = character.get_rect()
character_rect.left = character_x_pos
character_rect.top = character_y_pos
enemy_rect = enemy.get_rect()
enemy_rect.left = enemy_x_pos
enemy_rect.top = enemy_y_pos
# 충돌 체크
if character_rect.colliderect(enemy_rect):
print("충돌했어요")
running = False
screen.blit(background, (0, 0)) # 배경 그리기
screen.blit(character, (character_x_pos, character_y_pos)) # 캐릭터 그리기
screen.blit(enemy, (enemy_x_pos, enemy_y_pos)) # 적 그리기
# 타이머 집어 넣기
# 경과 시간 계산
elapse_time = (pygame.time.get_ticks() - start_ticks) / 1000
# 경과 시간을(ms)을 1000으로 나누어서 초(s) 단위로 표시
timer = game_font.render(str(int(total_time - elapse_time)), True, (255, 255, 255))
# 출력할 글자, True, 글자 색상
screen.blit(timer, (10, 10))
# 만약 시간이 0 이하이면 게임 종료
if total_time - elapse_time <= 0:
print("타임아웃")
running = False
pygame.display.update() # 게임화면을 다시 그리기
# 잠시 대기
pygame.time.delay(2000) # 2초 정도 대기 (ms)
# pygame 종료
pygame.quit()
728x90
'Project > 충돌, 피하기 게임' 카테고리의 다른 글
[Pygame] 기본틀 마무리 정리 (0) | 2022.06.02 |
---|---|
[Pygame] 적 생성하기, 충돌 처리 (0) | 2022.05.29 |
[Pygame] FPS 설정 (0) | 2022.05.28 |
[Pygame] 키보드 이벤트 (0) | 2022.05.27 |
[Pygame] 캐릭터 만들기 (0) | 2022.05.26 |