python으로 게임 만들기/pygame

[pygame] 10. 타이머 만들기

bay07 2024. 2. 24. 15:07

 

게임에서 타이머를 잘 만들어야한다. 시간을 측정하면서 경기를 진행하거나 점수를 주는 게임들이 많기 때문이다. 게임을 만들 때 시간을 어떻게 구하는가? 보통은 기준 시간대에서 현재시간을 빼는 방식으로 구하게 된다. 게임에서의 기준 시간은 1970년대를 기준으로 맞춰져있다. (처음 개발한 사람이 그렇게 했나보다) 그리고 보통 time 함수를 많이 쓰는데, 파이게임에서는 시간과 관련된 함수를 제공해주기 때문에, 여기서는 그것을 사용해보도록 하자. 

 

대략 타이머를 만드는 것에 관련된 코드들만 한번 모아두었다. 나는 사용자에게 100초의 시간적 여유를 주고 싶기 때문에, total_time을 100으로 설정했다. 그리고 여기서 흐른 시간 elapsed_time을 뺀 값을 나타냄으로서 타이머를 구현하였다. 또, 여기서 게임화면은 계속 업데이트를 해줘야한다. 

# 폰트 정의
# 폰트 객체 생성 (폰트, 크기)
# 디폴트 폰트 사용할 예정이라 그냥 None으로 적었음
game_font = pygame.font.Font(None, 40)

# 총 시간
total_time = 100

# 시작시간 정보
# 시작 tick을 받아옴
start_ticks = pygame.time.get_ticks()

    # 타이머 집어넣기 
    # 경과 시간 계산
    # 이 값이 ms (밀리세컨드)이기 때문에 초(s)로 바꾸려고 1000으로 나눈 것 
    elapsed_time = (pygame.time.get_ticks() - start_ticks)/1000
    
    # 출력할 글자, True, 글자 색상 넣기
    timer = game_font.render(str(int(total_time - elapsed_time)), True, (255,255,255))
    
    # 출력할 글자, 위치
    screen.blit(timer, (10,10))
    
    # 만약 시간이 0 이하이면 게임종료
    if total_time - elapsed_time <= 0:
        print("Time out")
        running = False
        
    # 게임화면 업데이트 하기
    pygame.display.update()

 

 

▷ 시연 영상

 


▷ 전체 코드

더보기
#10 타이머 만들기

import pygame
import time

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/pika2.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

ball = pygame.image.load("C:/Users/Soyoung/Desktop/pygame/ball.jpg")
ball_size = ball.get_rect().size
ball_width = ball_size[0]
ball_height = ball_size[1]
ball_x_pos = (screen_width/2) - (ball_width/2)
ball_y_pos = (screen_height/2) - (ball_height/2)

to_x =0
to_y = 0 
character_speed = 0.5

# 폰트 정의
# 폰트 객체 생성 (폰트, 크기)
# 디폴트 폰트 사용할 예정이라 그냥 None으로 적었음
game_font = pygame.font.Font(None, 40)

# 총 시간
total_time = 100

# 시작시간 정보
# 시작 tick을 받아옴
start_ticks = pygame.time.get_ticks()

running = True
while running:
    FPS = 60
    dt = clock.tick(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       
    
    character_rect = character.get_rect()
    character_rect.left = character_x_pos
    character_rect.top = character_y_pos
    
    ball_rect = ball.get_rect()
    ball_rect.left = ball_x_pos
    ball_rect.top = ball_y_pos      
    
    if character_rect.colliderect(ball_rect):
        # 출력할 글자, 위치
        ball_message = game_font.render("I caught Pikachu", True, (255,255,255))
        screen.blit(ball_message, (150,200))
        pygame.display.update()
        time.sleep(5)
        running = False
    
    screen.blit(background, (0,0))
    screen.blit(character,(character_x_pos, character_y_pos))
    screen.blit(ball,(ball_x_pos, ball_y_pos))
    pygame.display.update()
    
    # 타이머 집어넣기 
    # 경과 시간 계산
    # 이 값이 ms (밀리세컨드)이기 때문에 초(s)로 바꾸려고 1000으로 나눈 것 
    elapsed_time = (pygame.time.get_ticks() - start_ticks)/1000
    
    # 출력할 글자, True, 글자 색상 넣기
    timer = game_font.render(str(int(total_time - elapsed_time)), True, (255,255,255))
    
    # 출력할 글자, 위치
    screen.blit(timer, (10,10))
    
    # 만약 시간이 0 이하이면 게임종료
    if total_time - elapsed_time <= 0:
        print("Time out")
        running = False
        
    # 게임화면 업데이트 하기
    pygame.display.update()
    
screen.blit(background, (0,0))
pygame.display.update()
end_message = game_font.render("Game Finished !", True, (102,0,153))
screen.blit(end_message, (130,200))
pygame.display.update()
# 게임이 꺼지기 전에 3초정도 대기하기
pygame.time.delay(3000)

pygame.quit()

 

▷ 참고 자료

pygame : https://www.pygame.org/docs

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

발걸음 : https://www.youtube.com/watch?v=lz1q-rZD-E8&list=PLyrrhz0LjbCKn82y_sDTywdIsbVmqCb4K&index=45