본문 바로가기

코딩/파이썬 pygame

파이썬 게임 006. pygame.time.Clock 클래스를 이용해 게임 화면이 바뀌는 시간 제어

Game - Python - Pygame

 

Pygame 패키지의 pygame.time.Clock 클래스를 이용해 게임 화면이 바뀌는 시간을 제어해 본다.

 

본 글에서 사용하거나 참고하는 기능에 대한 정의는 다음과 같다.

 

pygame.time.wait(milliseconds) -> time
pygame.time.get_ticks() -> milliseconds
pygame.time.Clock() -> Clock
Clock.tick(framerate=0) -> milliseconds
Clock.get_time() -> milliseconds

예제 코드 1

<코드 1>

# python 3.9.6
# pygame 2.0.1

import pygame
import time
import random


def main():
    pygame.init()

    screen = pygame.display.set_mode((640, 480))

    running = True
    pre_time = time.time()

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT\
                    or event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                running = False
                break
        if not running:
            continue

        screen.fill((random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)),
                    (100, 100, 300, 300))
        pygame.display.update()

        print(time.time() - pre_time)
        pre_time = time.time()

    pygame.quit()


if __name__ == '__main__':
    main()

 

 

<코드 1>을 실행하면 게임 화면에서 지정한 영역의 색이 변경되는 것을 볼 수 있다.

 

하지만 지정된 영역의 색은 너무 빨리 바뀐다.

파이썬 표준 라이브러리인 time을 이용해 시간 간격을 출력해 보니 1ms 이하로 색이 바뀌고 있다.

 

0.0010025501251220703
0.0
0.0009968280792236328
0.0
0.0010058879852294922
0.0
0.0
0.0009927749633789062
0.0010056495666503906
0.0
0.000997781753540039
0.0009946823120117188
0.001001119613647461
0.0010027885437011719
0.0009930133819580078
0.0

예제 코드 2

<코드 2>

# python 3.9.6
# pygame 2.0.1

import pygame
import random


def main():
    pygame.init()

    screen = pygame.display.set_mode((640, 480))

    running = True
    pre_time = pygame.time.get_ticks()

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT\
                    or event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                running = False
                break
        if not running:
            continue

        screen.fill((random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)),
                    (100, 100, 300, 300))
        pygame.display.update()

        pygame.time.wait(500)
        print(pygame.time.get_ticks() - pre_time)
        pre_time = pygame.time.get_ticks()

    pygame.quit()


if __name__ == '__main__':
    main()

 

<코드 2>를 실행하면 0.5초 마다 지정한 영역의 색상이 변경되는 것을 볼 수 있다.

 

<코드 2>는 0.5초 간 프로그램 실행을 대기 상태로 놓기 위해 pygame.time.wait() 함수를 사용한다.

그리고 pygame 프로그램이 시작하고 난 후 시간의 경과를 확인하기 위해 pygame.time.get_ticks() 함수도 사용한다.

 

코드 print(pygame.time.get_ticks() - pre_time)의 실행 결과는 아래와 같다.

 

502
501
502
501
501
502
501
502
502
502

예제 코드 3

<코드 3>

# python 3.9.6
# pygame 2.0.1

import pygame
import random


def main():
    pygame.init()

    screen = pygame.display.set_mode((640, 480))
    clock = pygame.time.Clock()

    running = True
    pre_time = pygame.time.get_ticks()

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT\
                    or event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                running = False
                break
        if not running:
            continue

        screen.fill((random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)),
                    (100, 100, 300, 300))
        pygame.display.update()

        clock.tick(2)
        print(pygame.time.get_ticks() - pre_time)
        pre_time = pygame.time.get_ticks()
        print(clock.get_time())

    pygame.quit()


if __name__ == '__main__':
    main()

 

<코드 3>은 pygame.time.Clock 클래스를 사용해 게임 화면이 바뀌는 시간을 제어한다.

 

코드 clock.tick(2)는 1초에 2번 clock.tick(2) 함수가 호출되도록 한다.

 

코드 clock.get_time()는 clock.tick() 함수가 호출된 시간 간격을 반환한다.