기록과 정리의 공간

[프로젝트] 게임 재시작시 발생하는 문제 정리 본문

프로젝트/슈팅게임1

[프로젝트] 게임 재시작시 발생하는 문제 정리

딸기맛도나쓰 2020. 6. 28. 17:25

Pygame / pygame.time.get_ticks()관련 헷갈리는 부분 정리

(공식 문서 링크)


내가 정한 게임 플레이 제한 시간은 75000ms이다.
남은 게임 시간 계산 및 승리 조건을 처음에 아래와 같이 작성했는데, 게임 replay기능을 추가하기 전에는 아래와 같이 작성해도 아무 문제가 없었지만 저렇게 설정 해놓고 게임 재시작 기능을 넣으니 문제가 발생했다.

# 남은 시간 계산
time_remaining = 75000-pygame.time.get_ticks()

(중략)

# 게임 승리 조건
if pygmae.time.get_ticks() >= 75000:

아래 코드에서 main()함수가 끝나면, 승리 또는 패배 화면과 함께 게임 replay버튼이 나온다. 그 버튼을 클릭하면 게임이 재시작 된다.

  1. 패배 후 재시작 할 경우 : 패배 조건은 체력바가 게임 시간이 끝나기 전에 다 닳아버리는 경우이다. 이런 경우에 게임을 재시작하게 되면 75000ms동안 게임이 진행되는 것이 아니라, (패배 조건에 의해 메인 루프가 종료된 시점에서 남은 시간 - 리플레이 버튼 누르기 전까지 흐른 시간)만큼만 게임 진행이 가능하다.

  2. 승리 후 재시작 할 경우 : 승리 조건은 주어진 게임 시간이 끝날 때 까지 체력바가 0이 되지 않게 버티는 것이다. 이런 경우 승리 조건에 의해 메인 루프가 종료되는 시점에서 이미 get_ticks()함수의 리턴값은 75000ms를 초과한 값이므로 게임 replay버튼을 눌러도 main()가 호출되자 마자 아래 코드의 게임 승리 조건에 의해 바로 main()의 루프가 종료되어 계속 승리 화면만 출력되게 된다. 즉, 게임 replay가 불가능한 것이다.

  • 즉, 정리하자면 '승리'화면이 나온 이후에는 게임 재시작이 불가능한 것이다.
  • get_ticks()함수는 공식문서의 설명처럼 pygame.init()이 호출된 이후 흐른 시간(ms)를 리턴해주므로 계속 증가하는 값이라는 점을 간과하고 코드를 잘 못 작성했다.
# 수정 전 코드

pygame.init()

def main():
    running = 1
    exitcode = 0

    while running:
        (생략)
        # 남은 게임 시간 계산
        time_remaining = 75000 - pygame.time.get_ticks()
        # 게임 승리/패배 조건
        if pygame.time.get_ticks() >= 75000:
            running = 0
            exitcode = 1
        if health_value <= 0:
            running = 0
            exitcode = 0

     # 승리/패배/리플레이버튼 화면 그리기
         (생략)

main()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)
        # 게임 replay 조건
        elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            x, y = event.pos
            if x in range(replayRect.centerx - replay.get_width()//2, replayRect.centerx + replay.get_width()//2):
                if y in range(replayRect.centery - replay.get_height()//2, replayRect.centery + replay.get_width()//2):
                    main() # 게임 replay           

그리하여, 다음과 같이 코드를 수정하였다.

  1. main()while루프 시작 전에 time_start변수를 추가하여 main()가 호출된 시점의 get_ticks()값을 저장했다.
  2. 남은 시간(time_remaining)과 게임 승리 조건을 아래와 같이 변경했다.
# 수정 후 코드

pygame.init()

def main():
    running = 1
    exitcode = 0
    time_start = pygame.time.get_ticks() # 추가

    while running:
        (생략)
        # 변경된 남은 게임 시간 계산
        time_remaining = 75000 - (pygame.time.get_ticks() - time_start)
        # 변경된 게임 승리 조건
        if time_remaining <= 0:
            running = 0
            exitcode = 1
        # 패배 조건
        if health_value <= 0:
            running = 0
            exitcode = 0
    # 승리/패배/리플레이버튼 화면 그리기
         (생략)

main()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)
        # 게임 replay 조건
        elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            x, y = event.pos
            if x in range(replayRect.centerx - replay.get_width()//2, replayRect.centerx + replay.get_width()//2):
                if y in range(replayRect.centery - replay.get_height()//2, replayRect.centery + replay.get_width()//2):
                    main() # 게임 replay           
Comments