pygame은 python을 통해 게임을 만들 수 있도록 지원해주는 모듈입니다.

pygame의 구조와 사용법을 자세하게 다뤄보도록 하려고 합니다.


00. pygame 모듈 설치

pygame은 python 2.x와 python 3.x 모두에서 지원합니다.

때문에 설치를 위한 명령어는 다음과 같습니다.

C:/ > pip install pygame


만약 pip 명령어로 pygame이 잘 실행되지 않으시면 다음 링크에서 해결해보시면 될 것 같습니다.


python의 pip 명령이 들지 않을 때(python pip error)




01. pygame 기본 구조

pygame의 기본 구조는 다음과 같습니다.

위의 기본 구조를 바탕으로 소스 기반으로 설명하겠습니다.



Source - pygame 선언(import)

# Import a library of functions called 'pygame'
import pygame

# Import a library of functions called 'pygame' as pg
import pygame as pg

아주 당연한 말씀이겠지만, python을 실행할 때 pygame을 import 해주셔야 사용할 수 있습니다.

혹은, 우리가 사용하기 편하도록 pygame이라는 모듈의 이름을 pg라고 바꾸어 선언해주실 수 있습니다.

이는 초기화 단계에서 굳이 새로운 변수를 만들지 않고, pygame 대신 pg라는 이름으로 사용해줄 수 있어 편리합니다.



Source - pygame 초기화

# Initialize the game engine
pygame.init()

여기서도 마찬가지로, 당연하게도 pygame 모듈을 사용할 때 초기화(init)를 해주어야 합니다.

초기화는 위의 소스에서처럼 간단하게 pygame 모듈 이름 뒤에 .init() 함수를 사용해주는 방법을 사용하면 됩니다.



Source - pygame에서 사용할 전역 변수 선언

# Define the colors we will use in RGB format
BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)
BLUE  = (  0,   0, 255)
GREEN = (  0, 255,   0)
RED   = (255,   0,   0)

# Set the height and width of the screen
size   = [400, 300]
screen = pygame.display.set_mode(size)
 
pygame.display.set_caption("Game Title")
 
#Loop until the user clicks the close button.
done = False
clock = pygame.time.Clock()

pygame에서 사용할 여러 가지 변수나 설정은 위의 소스처럼 전역 변수로 만들어주는 것이 꽤 도움이 됩니다.

전역 변수로 만들어서 사용하게 되면, 어느 함수에서나 가져다 쓰기 편하고, 공통적으로 쓰이는 변수 같은 경우는 일일이 인자값을 설정해주는 번거로움도 줄어들기 때문입니다.

대체적으로 색깔, 위치, 화면 설정 등의 변수를 전역 변수로 사용하는 경우가 많습니다.

이 밖에도, 위의 소스를 통해 설명드릴 게 아주 많습니다. 허허.


15번째 라인과 16번째 라인을 먼저 보시겠습니다.

# Set the height and width of the screen
size   = [400, 300]
screen = pygame.display.set_mode(size)

15번째 라인은 pygame으로 생성할 창의 크기를 정해준 변수입니다. x축의 길이는 400, y축의 길이는 300이라고 설정하는 것과 같습니다.

16번째 라인은 pygame으로 생성할 창의 크기를 설정한 변수를 통해 GUI 창을 설정해는 변수입니다.

화면을 초기화, 화면에 데이터를 추가하는 것 등은 해당 screen 변수를 통해 적용되어집니다.


18번째 라인을 보시겠습니다.

pygame.display.set_caption("Game Title")

해당 라인은 GUI 창이 켜질 때, 창 이름을 설정하는 라인입니다.

이름은 한 번 설정하게 되면, 게임이 꺼지기 전까지 사라지지 않기 때문에 해당 라인은 전역 변수가 선언되는 라인에서 실행해주었습니다.


22번째 라인을 보시겠습니다.

#Loop until the user clicks the close button.
done = False
clock = pygame.time.Clock()

이 라인은 화면을 초당 몇 번 출력하는가를 설정하기 위해 선언되는 변수입니다.

초당 화면 출력은, 게임에서 FPS(Frame Per Second) 혹은 Frame Rate라고 합니다.

해당 변수를 이용하여 게임의 FPS를 설정해줄 수 있습니다.



Source - pygame 메인 루프

while not done:
 
    # This limits the while loop to a max of 10 times per second.
    # Leave this out and we will use all CPU we can.
    clock.tick(10)
    
    # Main Event Loop
    for event in pygame.event.get(): # User did something
        if event.type == pygame.QUIT: # If user clicked close
            done=True # Flag that we are done so we exit this loop
 
    # All drawing code happens after the for loop and but
    # inside the main while done==False loop.
     
    # Clear the screen and set the screen background
    screen.fill(WHITE)

    '''
    Your Work.....
    '''
    pygame.draw.polygon(screen, GREEN, [[30, 150], [125, 100], [220, 150]], 5)
    pygame.draw.polygon(screen, GREEN, [[30, 150], [125, 100], [220, 150]], 0)
    pygame.draw.lines(screen, RED, False, [[50, 150], [50, 250], [200, 250], [200, 150]], 5)
    pygame.draw.rect(screen, BLACK, [75, 175, 75, 50], 5)
    pygame.draw.rect(screen, BLUE, [75, 175, 75, 50], 0)
    pygame.draw.line(screen, BLACK, [112, 175], [112, 225], 5)
    pygame.draw.line(screen, BLACK, [75, 200], [150, 200], 5)

    # Go ahead and update the screen with what we've drawn.
    # This MUST happen after all the other drawing commands.
    pygame.display.flip()

pygame의 핵심은 메인 루프에 있다고 해도 과언이 아닙니다.

여기서 가장 중요한 '게임 실행 동안 발생한 이벤트에 대한 설정''사용자의 게임 알고리즘'이 해당 영역에 작성되어야 하기 때문입니다.

위의 소스에서 중요한 부분을 골라 설명해보도록 하겠습니다.


28번째 라인을 먼저 보시겠습니다.

# This limits the while loop to a max of 10 times per second.
# Leave this out and we will use all CPU we can.
clock.tick(10)

해당 라인은 위에서 설정한 pygame.time.Clock()을 선언한 clock 함수를 통해 FPS(초당 프레임)를 설정해주는 라인입니다.

값을 10으로 한 것은 초당 10번의 화면을 출력해주겠다는 의미입니다.

해당 값이 높을 수록 CPU를 많이 먹게 됩니다.

또한 프레임이 너무 높아서 모니터가 제대로 출력하지 못하는 경우도 있으니 주의해서 사용하시는 게 좋습니다.

기본적으로 10 혹은 30 혹은 60이 가장 좋습니다.


31번째, 32번째, 33번째 라인을 보시겠습니다.

# Main Event Loop
for event in pygame.event.get(): # User did something
    if event.type == pygame.QUIT: # If user clicked close
        done=True # Flag that we are done so we exit this loop

31번째 라인은 pygame.event.get() 함수를 통해 게임 중간에 발생한 이벤트를 캐치하여 검사하기 위한 인덱스로 사용하겠다는 의미입니다.

간단히 설명하면, 게임 중에 마우스 클릭, 혹은 키보드 클릭 등에 대한 이벤트가 발생하면 이를 인지하고, 과연 어떤 이벤트가 발생했는지 for문을 통해 검사하는 구조를 위한 라인입니다.

32번째 라인은 pygame.event.get() 함수를 통해 가져온 이벤트가 만약 pygame.QUIT 이라는 값과 일치하는지 검사하는 라인입니다.

해당 QUIT 값은 pygame이 종료되는 이벤트를 말하며, GUI 창에서 x 버튼을 누르면 발생하는 이벤트입니다.

33번째 라인은 만약 종료 이벤트가 맞다면 메인 루프의 while문이 더 이상 돌아가지 않도록 하기 위해 바꿔주는 것입니다.

만약 PC에서 오류가 발생하여, 게임이 꺼져야 함에도 불구하고 꺼지지 않을 경우, while문이 돌아가지 않게 하여 강제로 꺼질 수 있도록 하는 일종의 안전장치라고 보시면 됩니다.

항상 게임을 종료할 때는 while문이 종료할 수 있도록 합시다!


39번째 라인을 보시겠습니다.

    # Clear the screen and set the screen background
    screen.fill(WHITE)

해당 라인은 전체 화면을 관리하는 변수인 screen을 통해 fill() 함수를 실행한 것입니다.

fill() 함수는 화면 전체를 특정 색깔로 모두 채워주는 함수입니다.

여기서는 화면 전체를 WHITE 즉, RGB 값이 (255, 255, 255)인 값으로 채워주는 것을 말합니다.

그렇게 되면 하얀 화면이 출력되겠습니다.


41번째, 42번째, 43번째 라인을 보시겠습니다.

    '''
    Your Work.....
    '''
    pygame.draw.polygon(screen, GREEN, [[30, 150], [125, 100], [220, 150]], 5)
    pygame.draw.polygon(screen, GREEN, [[30, 150], [125, 100], [220, 150]], 0)
    pygame.draw.lines(screen, RED, False, [[50, 150], [50, 250], [200, 250], [200, 150]], 5)
    pygame.draw.rect(screen, BLACK, [75, 175, 75, 50], 5)
    pygame.draw.rect(screen, BLUE, [75, 175, 75, 50], 0)
    pygame.draw.line(screen, BLACK, [112, 175], [112, 225], 5)
    pygame.draw.line(screen, BLACK, [75, 200], [150, 200], 5)

사실 실제로 사용자의 행위가 작성된 곳은 44 ~ 50번째 라인입니다.

이는 제가 임의로 작성한 집을 그리기 위한 도형 함수를 나열한 것입니다.

해당 영역에는 여러분께서 원하는 작업을 자유롭게 작성하시면 됩니다.

만약 pygame.draw 함수에 대해 더 자세히 보고싶으시면 아래의 링크를 통해 참고하시면 될 것 같습니다.



사각형 - pygame.draw.rect

삼각형 - pygame.draw.polygon

원 - pygame.draw.circle

타원 - pygame.draw.ellipse

원(특정 부분까지 그리기) - pygame.draw.arc

선 - pygame.draw.line

여러 개의 선 - pygame.draw.lines

부드러운 선 - pygame.draw.aaline

여러 개의 부드러운 선 - pygame.draw.aalines




54번째 라인을 보시겠습니다.

    # Go ahead and update the screen with what we've drawn.
    # This MUST happen after all the other drawing commands.
    pygame.display.flip()

54번째 라인은 위에서 작성한 그리기 함수를 통해 지금까지 화면에 작성한 모든 행위를 업데이트해주기 위한 함수입니다.

즉, 해당 54번째 라인이 없으면, 지금까지 사용한 pygame.draw 함수들은 출력이 되지 않습니다.

물론 screen.fill(WHITE) 함수 또한 실행되지 않은 채 화면은 업데이트 되지 않을 것입니다.

때문에 반드시 pygame의 메인 루프의 끝에는 해당 pygame.display.flip() 함수를 사용해주셔야 합니다.


Source - pygame 전체 예제

# Import a library of functions called 'pygame'
import pygame

# Initialize the game engine
pygame.init()

# Define the colors we will use in RGB format
BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)
BLUE  = (  0,   0, 255)
GREEN = (  0, 255,   0)
RED   = (255,   0,   0)

# Set the height and width of the screen
size   = [400, 300]
screen = pygame.display.set_mode(size)
 
pygame.display.set_caption("Game Title")
 
#Loop until the user clicks the close button.
done = False
clock = pygame.time.Clock()
 
while not done:
 
    # This limits the while loop to a max of 10 times per second.
    # Leave this out and we will use all CPU we can.
    clock.tick(10)
    
    # Main Event Loop
    for event in pygame.event.get(): # User did something
        if event.type == pygame.QUIT: # If user clicked close
            done=True # Flag that we are done so we exit this loop
 
    # All drawing code happens after the for loop and but
    # inside the main while done==False loop.
     
    # Clear the screen and set the screen background
    screen.fill(WHITE)

    '''
    Your Work.....
    '''
    pygame.draw.polygon(screen, GREEN, [[30, 150], [125, 100], [220, 150]], 5)
    pygame.draw.polygon(screen, GREEN, [[30, 150], [125, 100], [220, 150]], 0)
    pygame.draw.lines(screen, RED, False, [[50, 150], [50, 250], [200, 250], [200, 150]], 5)
    pygame.draw.rect(screen, BLACK, [75, 175, 75, 50], 5)
    pygame.draw.rect(screen, BLUE, [75, 175, 75, 50], 0)
    pygame.draw.line(screen, BLACK, [112, 175], [112, 225], 5)
    pygame.draw.line(screen, BLACK, [75, 200], [150, 200], 5)

    # Go ahead and update the screen with what we've drawn.
    # This MUST happen after all the other drawing commands.
    pygame.display.flip()
 
# Be IDLE friendly
pygame.quit()

위의 소스들을 모두 종합해놓은 예제입니다.

실행해보시면 다음과 같습니다.



여기까지 pygame의 기본 실행 구조와 사용법에 대해 간단히 알아보았습니다.

긴 글 읽어주셔서 감사합니다.


+ Recent posts