pygame은 게임을 만들기 위한 모듈답게 게임에 필요한 여러 가지 요소를 지원합니다.

게임에 필요한 도형 그리기와 각종 사용자가 발생시키는 이벤트에 대한 구분, 그리고 음악 및 효과음을 재생할 수 있도록 합니다.

여기서는 pygame 모듈을 이용하여 사용자가 원하는 음악을 플레이할 수 있는 소스와 소스에 대한 설명을 작성하려 합니다.

참고한 예제는 Github에서 가져왔습니다.


예제 소스 링크 : juehan



00.pygame 음악재생 모듈

pygame에서는 pygame.mixer.music을 통한 음악재생 기능을 제공합니다.

하지만 해당 모듈가지로 음악을 재생시켜보기에는 어려움이 있으실 것입니다.

때문에 간단한 예제를 통해 설명하도록 하겠습니다.




01. pygame 음악재생 예제

예제 소스코드는 python 3.x의 형태로 작성되었으며, print문 외에는 큰 차이가 없습니다.

때문에 python 2.x 버전에서 실행하고자 하시는 분은 print문을 수정하여 실행하시면 됩니다.

또한 음악 파일의 위치가 Music이라는 디렉토리 내에 있는 것을 재생시키도록 되어 있습니다.

저와 같이 실행하고자 하지 않으시면, 음악 파일이 있는 위치를 적절히 수정해주시면 될 것입니다.

예제는 다음과 같습니다.

'''
Created on 2012. 2. 19.
This module is for playing mp3 (limited) and wav formatted audio file
@author: John
'''
import pygame

def playsound(soundfile):
    """Play sound through default mixer channel in blocking manner.
       This will load the whole sound into memory before playback
    """    
    pygame.init()
    pygame.mixer.init()
    sound = pygame.mixer.Sound(soundfile)
    clock = pygame.time.Clock()
    sound.play()
    while pygame.mixer.get_busy():
        print("Playing... - func => playsound")
        clock.tick(1000)

def playmusic(soundfile):
    """Stream music with mixer.music module in blocking manner.
       This will stream the sound from disk while playing.
    """
    pygame.init()
    pygame.mixer.init()
    clock = pygame.time.Clock()
    pygame.mixer.music.load(soundfile)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        print("Playing... - func => playingmusic")
        clock.tick(1000)
        

def stopmusic():
    """stop currently playing music"""
    pygame.mixer.music.stop()

def getmixerargs():
    pygame.mixer.init()
    freq, size, chan = pygame.mixer.get_init()
    return freq, size, chan


def initMixer():
    BUFFER = 3072  # audio buffer size, number of samples since pygame 1.8.
    FREQ, SIZE, CHAN = getmixerargs()
    pygame.mixer.init(FREQ, SIZE, CHAN, BUFFER)


'''You definitely need test mp3 file (a.mp3 in example) in a directory, say under 'C:\\Temp'
   * To play wav format file instead of mp3, 
      1) replace a.mp3 file with it, say 'a.wav'
      2) In try except clause below replace "playmusic()" with "playsound()"
    
'''
                    
try:
    initMixer()
    filename = 'Musics\\01.mp3'
    playmusic(filename)
except KeyboardInterrupt:   # to stop playing, press "ctrl-c"
    stopmusic()
    print("\nPlay Stopped by user")
except Exception:
    print("unknown error")
    
print("Done")


위의 예제의 결과를 보기 위해서는 커맨드에서 실행을 하셔야 합니다.



음악이 재생 중일 때는 playmusic 함수가 실행되는 것을 확인할 수 있습니다.

또한 음악 재생을 멈출 때 Ctrl + C를 사용하면 음악 재생이 멈추는 것을 확인할 수 있습니다.



02. pygame 음악재생 예제 설명

pygame에서 예제를 부분부분 나눠 설명해보도록 하겠습니다.


먼저 58번째 라인에서 66번째 라인을 보도록 하겠습니다.

try:
    initMixer()
    filename = 'Musics\\01.mp3'
    playmusic(filename)
except KeyboardInterrupt:   # to stop playing, press "ctrl-c"
    stopmusic()
    print("\nPlay Stopped by user")
except Exception:
    print("unknown error")
    
print("Done")

58번째 라인은 예외상황이 발생했을 때를 대비하여 try문으로 시작합니다.

예외처리 구문은 Ctrl + C를 눌렀을 때(Keyboard Interrupt)와 그 외의 상황으로 구분하였습니다.

59번째 라인은 음악을 재생하기 위해 필요한 요소를 초기화 해주는 함수입니다.

그리고 61번째 라인에서의 playmusic() 함수에서는 재생할 파일의 디렉토리(혹은 이름만) 가져와 음악을 재생합니다.

만약 음악이 재생되는 도중에 Ctrl + C를 하게 되면, 예외문이 발생하여 stopmusic() 함수를 통해 음악 재생을 멈추고 꺼지게 됩니다.


다음으로 21번째 라인에서 32번째 라인을 보도록 하겠습니다.

def playmusic(soundfile):
    """Stream music with mixer.music module in blocking manner.
       This will stream the sound from disk while playing.
    """
    pygame.init()
    pygame.mixer.init()
    clock = pygame.time.Clock()
    pygame.mixer.music.load(soundfile)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        print("Playing... - func => playingmusic")
        clock.tick(1000)

21번째 함수의 인자값(parameter)인 soundfile은 음악파일 및 디렉토리의 경로를 받는 변수입니다.

우리가 실행할 음악파일 및 디렉토리를 받아 pygame.mixer.music.load() 함수를 통해 파일을 메모리에 올립니다.

그 후, pygame.mixer.music.play() 함수를 통해 메모리에 올린 음악 파일을 재생시킵니다.

여기서 중요한 것이 30번째 라인부터 32번째 라인입니다.

만약 음악이 아직 재생중이라면 pygame.mixer.music.get_busy() 함수에서 True를 반환할 것입니다.

그러면 음악 재생 시간을 clock.tick() 함수를 통해 재생 시간을 연장시킵니다.

이 과정을 계속 반복하다가, 이후 재생이 끝나고 pygame.mixer.music.get_busy() 함수에서 False가 반환되면, 반복문을 빠져나오게 되어, 프로그램이 종료됩니다.

위의 설명의 구조는 다음과 같습니다.




음악 재생 프로그램은 상당히 까다로운 녀석이었습니다.

하지만, 위의 큰 흐름을 유지한 채로 프로그램을 커스터마이징 하여 자신만의 음악재생 프로그램을 만들어보도록 합시다~


pygame을 사용할 때 pygame 자체적으로 제공하는 Event 목록을 적절하게 이용하게 되면, 훨씬 게임을 유용하게 코딩할 수 있게 됩니다.

이벤트는 마우스, 키보드, 조이스틱, 디스플레이 및 기타 여러 가지 행동에 대한 상태 정보를 인지하여 좀 더 유용한 코딩을 가능하게 합니다.

먼저 이벤트 목록에 대해 알아보겠습니다.


00. pygame Event 목록

pygame에서 제공하는 Event 목록은 다음과 같습니다.

이벤트 이름

 이벤트 속성

 설명

 pygame.QUIT

 none

 게임 종료 버튼(창 닫기 버튼) 클릭 시 발생함

 pygame.ACTIVEEVENT

 gain, state

 화면 활성화에 대한 이벤트로, 화면(GUI)에 마우스가 들어가거나 나가면 발생함

 혹은 화면이 활성화 상태이면 발생함

 pygame.KEYDOWN

 unicode, key, mod

 키보드를 누른 후 뗄 때 발생함

 pygame.KEYUP

 key, mod

 키보드를 누를 때 발생함

 pygame.MOUSEMOTION

 pos, rel, buttons

 마우스가 움직일 때 발생함

 pygame.MOUSEBUTTONUP

 pos, button

 마우스 버튼을 누른 후 뗄 때 발생함

 pygame.MOUSEBUTTONDOWN

 pos, button

 마우스 버튼을 눌렀을 때 발생함

 pygame.JOYAXISMOTION

 joy, axis, value

 조이스틱 축이 변경되면 발생함

 pygame.JOYBALLMOTION

 joy, ball, rel

 조이스틱 볼이 움직이면(회전하면) 발생함

 pygame.JOYHATMOTION

 joy, hat, value

 조이스틱 hat이 바뀌면 발생함

 pygame.JOYBUTTONUP

 joy, button

 조이스틱 버튼을 눌렀을 때 발생함

 pygame.JOYBUTTONDOWN

 joy, button

 조이스틱 버튼을 누른 후 뗄 때 발생함

 pygame.VIDEORESIZE

 size, w, h

 디스플레이가 pygame.RESIZABLE 플래그로 설정되면, 사용자가 창 크기를 조정하기 위해 발생함

 pygame.VIDEOEXPOSE

 none

 화면의 일부를 다시 그려야 하는 경우 화면에 직접 그리는 하드웨어 디스플레이가 발생시킴

 pygame.USEREVENT

 code

 사용자가 임의로 설정하는 이벤트


위와 같이 다양한 이벤트 목록을 제공합니다.

우리는 여기서 pygame.MOUSEBUTTONDOWN, pygame.MOUSEBUTTONUP의 이벤트에 대해 알아보도록 하겠습니다.

만약 다른 pygame 이벤트에 대한 자료를 참고하고 싶으시다면 아래의 링크에서 선택하시면 될 것 같습니다.



종료 이벤트 QUIT

화면 활성화 이벤트 ACTIVEEVENT

키보드 입력 이벤트 KEYDOWN/UP

마우스 움직임 이벤트 MOUSEMOTION




01. pygame.MOUSEBUTTONDOWN, pygame.MOUSEBUTTONUP 이벤트 예제

pygame.MOUSEBUTTONDOWN, pygame.MOUSEBUTTONUP은 게임 화면에서 마우스 클릭이 있는지에 따라 발생하는 이벤트입니다.

다음 예제를 먼저 살펴보도록 하겠습니다.

# 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)
font = pygame.font.SysFont("consolas", 20)

pygame.display.set_caption("Game Title")
 
#Loop until the user clicks the close button.
done  = False
flag  = None
clock = pygame.time.Clock()

# print text function
def printText(msg, color='BLACK', pos=(50, 50)):
    textSurface      = font.render(msg, True, pygame.Color(color), None)
    textRect         = textSurface.get_rect()
    textRect.topleft = pos

    screen.blit(textSurface, textRect)

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.MOUSEBUTTONDOWN: # If user release what he pressed.
            flag = True
        elif event.type == pygame.MOUSEBUTTONUP: # If user press any key.
            flag = False
        elif event.type == pygame.QUIT:  # If user clicked close.
            done = True                  

    
    # 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)

    # Print red text if user pressed any key.
    if flag == True:
        printText('you just mouse down!!', 'RED')
        printText('--> you pressed your', 'RED', (50, 70))
        printText('    left mouse button.', 'RED', (50, 90))

    # Print blue text if user released any key.
    elif flag == False:
        printText('you just mouse up!!', 'BLUE')
        printText('--> released what you pressed.', 'BLUE', (50, 70))

    # Print default text if user do nothing.
    else:
        printText('Please press any key.')

    # 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()


위의 예제의 결과는 다음과 같습니다.




02. pygame.MOUSEBUTTONDOWN, pygame.MOUSEBUTTONUP 이벤트 예제 설명

결과를 확인하셨다면, 어떤 원리인지 위의 예제의 특정 라인을 통해 자세히 설명해보도록 하겠습니다.


먼저 41번째 라인에서 47번째 라인을 보도록 하겠습니다.

    # Main Event Loop
    for event in pygame.event.get(): # User did something
        if event.type == pygame.MOUSEBUTTONDOWN: # If user release what he pressed.
            flag = True
        elif event.type == pygame.MOUSEBUTTONUP: # If user press any key.
            flag = False
        elif event.type == pygame.QUIT:  # If user clicked close.
            done = True   

41번째 라인에서는 pygame.event.get() 함수를 통해 사용자가 발생시킨 이벤트를 가져옵니다.

가져온 이벤트 중 하나를 event라는 변수로 생각하고, 해당 이벤트의 type을 검사합니다.

42번째 라인에서는 pygame의 이벤트 중 MOUSEBUTTONDOWN 타입인지 확인하고, 44번째 라인은 MOUSEBUTTONUP 타입인지 확인하는 라인입니다.

각각 MOUSEBUTTONDOWN일 때 True, MOUSEBUTTONUP일 때 False로 설정되도록 하였고, 아무런 동작이 없는 처음 화면은 None으로 해두었습니다.

해당 이벤트는 마우스 버튼의 클릭이 발생하고, 클릭한 버튼을 다시 클릭해제 했을 때 발생합니다.


57번째 라인에서 65번째 라인을 보도록 하겠습니다.

    # Print red text if user pressed any key.
    if flag == True:
        printText('you just mouse down!!', 'RED')
        printText('--> you pressed your', 'RED', (50, 70))
        printText('    left mouse button.', 'RED', (50, 90))

    # Print blue text if user released any key.
    elif flag == False:
        printText('you just mouse up!!', 'BLUE')
        printText('--> released what you pressed.', 'BLUE', (50, 70))

    # Print default text if user do nothing.
    else:
        printText('Please press any key.')

57번째 라인은 Mouse Button Down일 때, 즉 클릭 후 클릭한 상태를 유치했을 때를 확인하기 위한 조건문입니다.

또한 63번째 라인은 Mouse Button Up일 때, 즉 마우스 클릭 상태를 해제했을 때를 확인하기 위한 조건문입니다.

조건문의 결과는 위와 같습니다.


pygame을 사용할 때 pygame 자체적으로 제공하는 Event 목록을 적절하게 이용하게 되면, 훨씬 게임을 유용하게 코딩할 수 있게 됩니다.

이벤트는 마우스, 키보드, 조이스틱, 디스플레이 및 기타 여러 가지 행동에 대한 상태 정보를 인지하여 좀 더 유용한 코딩을 가능하게 합니다.

먼저 이벤트 목록에 대해 알아보겠습니다.


00. pygame Event 목록

pygame에서 제공하는 Event 목록은 다음과 같습니다.

이벤트 이름

 이벤트 속성

 설명

 pygame.QUIT

 none

 게임 종료 버튼(창 닫기 버튼) 클릭 시 발생함

 pygame.ACTIVEEVENT

 gain, state

 화면 활성화에 대한 이벤트로, 화면(GUI)에 마우스가 들어가거나 나가면 발생함

 혹은 화면이 활성화 상태이면 발생함

 pygame.KEYDOWN

 unicode, key, mod

 키보드를 누른 후 뗄 때 발생함

 pygame.KEYUP

 key, mod

 키보드를 누를 때 발생함

 pygame.MOUSEMOTION

 pos, rel, buttons

 마우스가 움직일 때 발생함

 pygame.MOUSEBUTTONUP

 pos, button

 마우스 버튼을 누른 후 뗄 때 발생함

 pygame.MOUSEBUTTONDOWN

 pos, button

 마우스 버튼을 눌렀을 때 발생함

 pygame.JOYAXISMOTION

 joy, axis, value

 조이스틱 축이 변경되면 발생함

 pygame.JOYBALLMOTION

 joy, ball, rel

 조이스틱 볼이 움직이면(회전하면) 발생함

 pygame.JOYHATMOTION

 joy, hat, value

 조이스틱 hat이 바뀌면 발생함

 pygame.JOYBUTTONUP

 joy, button

 조이스틱 버튼을 눌렀을 때 발생함

 pygame.JOYBUTTONDOWN

 joy, button

 조이스틱 버튼을 누른 후 뗄 때 발생함

 pygame.VIDEORESIZE

 size, w, h

 디스플레이가 pygame.RESIZABLE 플래그로 설정되면, 사용자가 창 크기를 조정하기 위해 발생함

 pygame.VIDEOEXPOSE

 none

 화면의 일부를 다시 그려야 하는 경우 화면에 직접 그리는 하드웨어 디스플레이가 발생시킴

 pygame.USEREVENT

 code

 사용자가 임의로 설정하는 이벤트


위와 같이 다양한 이벤트 목록을 제공합니다.

우리는 여기서 pygame.MOUSEMOTION의 이벤트에 대해 알아보도록 하겠습니다.

만약 다른 pygame 이벤트에 대한 자료를 참고하고 싶으시다면 아래의 링크에서 선택하시면 될 것 같습니다.



종료 이벤트 QUIT

화면 활성화 이벤트 ACTIVEEVENT

키보드 입력 이벤트 KEYDOWN/UP

마우스 클릭 이벤트 MOUSEBUTTONDOWN/UP




01. pygame.MOUSEMOTION 이벤트 예제

pygame.MOUSEMOTION은 게임 화면에서 마우스가 움직이게 되면 발생하는 이벤트입니다.

다음 예제를 먼저 살펴보도록 하겠습니다.

# 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)
font = pygame.font.SysFont("consolas", 20)

pygame.display.set_caption("Game Title")
 
#Loop until the user clicks the close button.
done  = False
flag  = None
clock = pygame.time.Clock()

# print text function
def printText(msg, color='BLACK', pos=(50, 50)):
    textSurface      = font.render(msg, True, pygame.Color(color), None)
    textRect         = textSurface.get_rect()
    textRect.topleft = pos

    screen.blit(textSurface, textRect)

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.MOUSEMOTION: # If user release what he pressed.
            flag = True
        elif event.type == pygame.QUIT:  # If user clicked close.
            done = True                  

    
    # 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)

    # Print red text if user pressed any key.
    if flag == True:
        printText('Your mouse is now moving!!', 'RED')
        flag = False

    # Print blue text if user released any key.
    elif flag == False:
        printText('Your mouse is now stopped!!', 'BLUE')

    # 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()


위의 예제의 결과는 다음과 같습니다.





02. pygame.MOUSEMOTION 이벤트 예제 설명

결과를 확인하셨다면, 어떤 원리인지 위의 예제의 특정 라인을 통해 자세히 설명해보도록 하겠습니다.


먼저 41번째 라인에서 45번째 라인을 보도록 하겠습니다.

    # Main Event Loop
    for event in pygame.event.get(): # User did something
        if event.type == pygame.MOUSEMOTION: # If user release what he pressed.
            flag = True
        elif event.type == pygame.QUIT:  # If user clicked close.
            done = True         

41번째 라인에서는 pygame.event.get() 함수를 통해 사용자가 발생시킨 이벤트를 가져옵니다.

가져온 이벤트 중 하나를 event라는 변수로 생각하고, 해당 이벤트의 type을 검사합니다.

42번째 라인에서는 pygame의 이벤트 중 MOUSEMOTION 타입인지 확인하여, 마우스가 움직이는 이벤트가 발생했는지 확인합니다.

만약 MOUSEMOTION 이벤트가 발생하면 flag를 True로 만들어줍니다.


55번째 라인에서 61번째 라인을 보도록 하겠습니다.

    # Print red text if user pressed any key.
    if flag == True:
        printText('Your mouse is now moving!!', 'RED')
        flag = False

    # Print blue text if user released any key.
    elif flag == False:
        printText('Your mouse is now stopped!!', 'BLUE')

55번째 라인에서 만약 MOUSEMOTION 이벤트가 발생하여 flag가 True가 된다면, 마우스가 움직이는지 확인할 수 있도록 문자를 출력해보았습니다.

이후 MOUSEMOTION 이벤트 상태가 지속되지 않도록 하기 위해서는 True일 때마다 flag를 False로 초기화해줍니다.

그러면 다시 마우스가 움직이지 않을 때 움직이지 않음을 나타내는 문자를 출력할 수 있습니다.


pygame을 사용할 때 pygame 자체적으로 제공하는 Event 목록을 적절하게 이용하게 되면, 훨씬 게임을 유용하게 코딩할 수 있게 됩니다.

이벤트는 마우스, 키보드, 조이스틱, 디스플레이 및 기타 여러 가지 행동에 대한 상태 정보를 인지하여 좀 더 유용한 코딩을 가능하게 합니다.

먼저 이벤트 목록에 대해 알아보겠습니다.


00. pygame Event 목록

pygame에서 제공하는 Event 목록은 다음과 같습니다.

이벤트 이름

 이벤트 속성

 설명

 pygame.QUIT

 none

 게임 종료 버튼(창 닫기 버튼) 클릭 시 발생함

 pygame.ACTIVEEVENT

 gain, state

 화면 활성화에 대한 이벤트로, 화면(GUI)에 마우스가 들어가거나 나가면 발생함

 혹은 화면이 활성화 상태이면 발생함

 pygame.KEYDOWN

 unicode, key, mod

 키보드를 누른 후 뗄 때 발생함

 pygame.KEYUP

 key, mod

 키보드를 누를 때 발생함

 pygame.MOUSEMOTION

 pos, rel, buttons

 마우스가 움직일 때 발생함

 pygame.MOUSEBUTTONUP

 pos, button

 마우스 버튼을 누른 후 뗄 때 발생함

 pygame.MOUSEBUTTONDOWN

 pos, button

 마우스 버튼을 눌렀을 때 발생함

 pygame.JOYAXISMOTION

 joy, axis, value

 조이스틱 축이 변경되면 발생함

 pygame.JOYBALLMOTION

 joy, ball, rel

 조이스틱 볼이 움직이면(회전하면) 발생함

 pygame.JOYHATMOTION

 joy, hat, value

 조이스틱 hat이 바뀌면 발생함

 pygame.JOYBUTTONUP

 joy, button

 조이스틱 버튼을 눌렀을 때 발생함

 pygame.JOYBUTTONDOWN

 joy, button

 조이스틱 버튼을 누른 후 뗄 때 발생함

 pygame.VIDEORESIZE

 size, w, h

 디스플레이가 pygame.RESIZABLE 플래그로 설정되면, 사용자가 창 크기를 조정하기 위해 발생함

 pygame.VIDEOEXPOSE

 none

 화면의 일부를 다시 그려야 하는 경우 화면에 직접 그리는 하드웨어 디스플레이가 발생시킴

 pygame.USEREVENT

 code

 사용자가 임의로 설정하는 이벤트


위와 같이 다양한 이벤트 목록을 제공합니다.

우리는 여기서 pygame.KEYDOWN, pygame.KEYUP의 이벤트에 대해 알아보도록 하겠습니다.

만약 다른 pygame 이벤트에 대한 자료를 참고하고 싶으시다면 아래의 링크에서 선택하시면 될 것 같습니다.



종료 이벤트 QUIT

화면 활성화 이벤트 ACTIVEEVENT

마우스 움직임 이벤트 MOUSEMOTION

마우스 클릭 이벤트 MOUSEBUTTONDOWN/UP





01. pygame.KEYDOWN, pygame.KEYUP 이벤트 예제

pygame.KEYDOWN, pygame.KEYUP은 게임 화면이 활성화된 상태에서 키보드 입력에 따라 발생하는 이벤트입니다.

다음 예제를 먼저 살펴보도록 하겠습니다.

# 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)
font = pygame.font.SysFont("consolas", 20)

pygame.display.set_caption("Game Title")
 
#Loop until the user clicks the close button.
done  = False
flag  = None
clock = pygame.time.Clock()

# print text function
def printText(msg, color='BLACK', pos=(50, 50)):
    textSurface      = font.render(msg, True, pygame.Color(color), None)
    textRect         = textSurface.get_rect()
    textRect.topleft = pos

    screen.blit(textSurface, textRect)

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.KEYDOWN: # If user release what he pressed.
            pressed = pygame.key.get_pressed()
            buttons = [pygame.key.name(k) for k,v in enumerate(pressed) if v]
            flag = True
        elif event.type == pygame.KEYUP: # If user press any key.
            flag = False
        elif event.type == pygame.QUIT:  # If user clicked close.
            done = True                  

    
    # 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)

    # Print red text if user pressed any key.
    if flag == True:
        printText('you just key down!!', 'RED')
        printText('--> you pressed any key.', 'RED', (50, 70))
        printText('Pressed Key : ' + buttons[0], 'RED', (50, 90))

    # Print blue text if user released any key.
    elif flag == False:
        printText('you just key up!!', 'BLUE')
        printText('--> released what you pressed.', 'BLUE', (50, 70))

    # Print default text if user do nothing.
    else:
        printText('Please press any key.')

    # 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()

위의 예제의 결과는 다음과 같습니다.




02. pygame.KEYDOWN, pygame.KEYUP 이벤트 예제 설명

결과를 확인하셨다면, 어떤 원리인지 위의 예제의 특정 라인을 통해 자세히 설명해보도록 하겠습니다.


먼저 41번째 라인에서 49번째 라인을 보도록 하겠습니다.

    # Main Event Loop
    for event in pygame.event.get(): # User did something
        if event.type == pygame.KEYDOWN: # If user release what he pressed.
            pressed = pygame.key.get_pressed()
            buttons = [pygame.key.name(k) for k,v in enumerate(pressed) if v]
            flag = True
        elif event.type == pygame.KEYUP: # If user press any key.
            flag = False
        elif event.type == pygame.QUIT:  # If user clicked close.
            done = True     

41번째 라인에서는 pygame.event.get() 함수를 통해 사용자가 발생시킨 이벤트를 가져옵니다.

가져온 이벤트 중 하나를 event라는 변수로 생각하고, 해당 이벤트의 type을 검사합니다.

42번째 라인에서는 pygame의 이벤트 중 KEYDOWN 타입인지 확인하고, 46번째 라인은 KEYUP 타입인지 확인하는 라인입니다.

각각 KEYDOWN일 때 True, KEYUP일 때 False로 설정되도록 하였고, 아무런 동작이 없는 처음 화면은 None으로 해두었습니다.

해당 이벤트는 키보드의 입력이 있을 때, 입력했던 값이 없어졌을 때 발생합니다.

그외의 43번째 ~ 44번째 라인은 입력된 값이 무엇인지 판별하기 위해 작성한 코드입니다.


59번째 라인에서 71번째 라인을 보도록 하겠습니다.

    # Print red text if user pressed any key.
    if flag == True:
        printText('you just key down!!', 'RED')
        printText('--> you pressed any key.', 'RED', (50, 70))
        printText('Pressed Key : ' + buttons[0], 'RED', (50, 90))

    # Print blue text if user released any key.
    elif flag == False:
        printText('you just key up!!', 'BLUE')
        printText('--> released what you pressed.', 'BLUE', (50, 70))

    # Print default text if user do nothing.
    else:
        printText('Please press any key.')

59번째 라인은 Key Down일 때 키가 입력됐는지 확인하기 위한 조건문입니다.

또한 65번째 라인은 Key Up일 때 입력된 키가 입력이 종료되었는지 확인하기 위한 조건문입니다.

조건문의 결과는 위와 같습니다.


pygame을 사용할 때 pygame 자체적으로 제공하는 Event 목록을 적절하게 이용하게 되면, 훨씬 게임을 유용하게 코딩할 수 있게 됩니다.

이벤트는 마우스, 키보드, 조이스틱, 디스플레이 및 기타 여러 가지 행동에 대한 상태 정보를 인지하여 좀 더 유용한 코딩을 가능하게 합니다.

먼저 이벤트 목록에 대해 알아보겠습니다.


00. pygame Event 목록

pygame에서 제공하는 Event 목록은 다음과 같습니다.

이벤트 이름

 이벤트 속성

 설명

 pygame.QUIT

 none

 게임 종료 버튼(창 닫기 버튼) 클릭 시 발생함

 pygame.ACTIVEEVENT

 gain, state

 화면 활성화에 대한 이벤트로, 화면(GUI)에 마우스가 들어가거나 나가면 발생함

 혹은 화면이 활성화 상태이면 발생함

 pygame.KEYDOWN

 unicode, key, mod

 키보드를 누른 후 뗄 때 발생함

 pygame.KEYUP

 key, mod

 키보드를 누를 때 발생함

 pygame.MOUSEMOTION

 pos, rel, buttons

 마우스가 움직일 때 발생함

 pygame.MOUSEBUTTONUP

 pos, button

 마우스 버튼을 누른 후 뗄 때 발생함

 pygame.MOUSEBUTTONDOWN

 pos, button

 마우스 버튼을 눌렀을 때 발생함

 pygame.JOYAXISMOTION

 joy, axis, value

 조이스틱 축이 변경되면 발생함

 pygame.JOYBALLMOTION

 joy, ball, rel

 조이스틱 볼이 움직이면(회전하면) 발생함

 pygame.JOYHATMOTION

 joy, hat, value

 조이스틱 hat이 바뀌면 발생함

 pygame.JOYBUTTONUP

 joy, button

 조이스틱 버튼을 눌렀을 때 발생함

 pygame.JOYBUTTONDOWN

 joy, button

 조이스틱 버튼을 누른 후 뗄 때 발생함

 pygame.VIDEORESIZE

 size, w, h

 디스플레이가 pygame.RESIZABLE 플래그로 설정되면, 사용자가 창 크기를 조정하기 위해 발생함

 pygame.VIDEOEXPOSE

 none

 화면의 일부를 다시 그려야 하는 경우 화면에 직접 그리는 하드웨어 디스플레이가 발생시킴

 pygame.USEREVENT

 code

 사용자가 임의로 설정하는 이벤트


위와 같이 다양한 이벤트 목록을 제공합니다.

우리는 여기서 pygame.ACTIVEEVENT의 이벤트에 대해 알아보도록 하겠습니다.

만약 다른 pygame 이벤트에 대한 자료를 참고하고 싶으시다면 아래의 링크에서 선택하시면 될 것 같습니다.



종료 이벤트 QUIT

키보드 입력 이벤트 KEYDOWN/UP

마우스 움직임 이벤트 MOUSEMOTION

마우스 클릭 이벤트 MOUSEBUTTONDOWN/UP






01. pygame.ACTIVEEVENT 이벤트 예제

pygame.ACTIVEEVENT은 게임 화면에 마우스가 있는지 없는지에 따라 발생하는 이벤트입니다.

다음 예제를 먼저 살펴보도록 하겠습니다.

# 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)
font = pygame.font.SysFont("consolas", 20)

pygame.display.set_caption("Game Title")
 
#Loop until the user clicks the close button.
done  = False
flag  = True
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.ACTIVEEVENT: # If user's mouse in the display or out.
            flag ^= True
        elif event.type == pygame.QUIT:
            done  = True                     # If user clicked close.

 
    # 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)

    # Drawing House If User Mouse Is In Display.
    if flag == True:
        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)

    # Print Message If User Mouse Is In Outside.
    else:
        textSurface      = font.render('Mouse is outside!!', True, pygame.Color('BLACK'), None)
        textRect         = textSurface.get_rect()
        textRect.topleft = (50, 50)

        screen.blit(textSurface, textRect)

    # 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()

위의 예제의 결과는 다음과 같습니다.




02. pygame.ACTIVEEVENT 이벤트 예제 설명

결과를 확인하셨다면, 어떤 원리인지 위의 예제의 특정 라인을 통해 자세히 설명해보도록 하겠습니다.


먼저 35번째 라인에서 39번째 라인을 보도록 하겠습니다.

    # Main Event Loop
    for event in pygame.event.get(): # User did something
        if event.type == pygame.ACTIVEEVENT: # If user's mouse in the display or out.
            flag ^= True
        elif event.type == pygame.QUIT:
            done  = True                     # If user clicked close.

33번째 라인에서는 pygame.event.get() 함수를 통해 사용자가 발생시킨 이벤트를 가져옵니다.

가져온 이벤트 중 하나를 event라는 변수로 생각하고, 해당 이벤트의 type을 검사합니다.

34번째 라인에서는 pygame의 이벤트 중 ACTIVEEVENT 타입인지 확인하고, 35번째 라인은 ACTIVEEVENT가 발생할 때 변화를 보여주기 위한 flag 값입니다.

해당 이벤트는 게임 창에 마우스가 들어가거나 나갈 때 발생하거나, 활성화의 상태에 따라 달라집니다.

그외의 36번째 ~ 37번째 라인은 닫기 버튼을 누르면 게임이 꺼질 수 있도록 pygame.QUIT 이벤트에 루프를 벗어나기 위한 설정을 해두었습니다.


46번째 라인에서 62번째 라인을 보도록 하겠습니다.

    # Drawing House If User Mouse Is In Display.
    if flag == True:
        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)

    # Print Message If User Mouse Is In Outside.
    else:
        textSurface      = font.render('Mouse is outside!!', True, pygame.Color('BLACK'), None)
        textRect         = textSurface.get_rect()
        textRect.topleft = (50, 50)

        screen.blit(textSurface, textRect)

46번째 라인은 위의 35번째 라인에서 flag라는 변수가 True혹은 False로 바뀌었을 때 출력되도록 설정한 코드입니다.

마우스가 밖으로 나가거나 화면 안으로 들어올 때마다 True 혹은 False로 바뀌도록 하였습니다.

57번째 라인부터 62번째 라인은 화면에 글씨가 출력될 수 있도록 하는 코드입니다.

이는 추후에 다루도록 하겠습니다.

<

pygame을 사용할 때 pygame 자체적으로 제공하는 Event 목록을 적절하게 이용하게 되면, 훨씬 게임을 유용하게 코딩할 수 있게 됩니다.

이벤트는 마우스, 키보드, 조이스틱, 디스플레이 및 기타 여러 가지 행동에 대한 상태 정보를 인지하여 좀 더 유용한 코딩을 가능하게 합니다.

먼저 이벤트 목록에 대해 알아보겠습니다.


00. pygame Event 목록

pygame에서 제공하는 Event 목록은 다음과 같습니다.

이벤트 이름

 이벤트 속성

 설명

 pygame.QUIT

 none

 게임 종료 버튼(창 닫기 버튼) 클릭 시 발생하거나 커맨드창에서 Ctrl + C를 입력하면 발생함

 pygame.ACTIVEEVENT

 gain, state

 화면 활성화에 대한 이벤트로, 화면(GUI)에 마우스가 들어가거나 나가면 발생함

 혹은 화면이 활성화 상태이면 발생함

 pygame.KEYDOWN

 unicode, key, mod

 키보드를 누른 후 뗄 때 발생함

 pygame.KEYUP

 key, mod

 키보드를 누를 때 발생함

 pygame.MOUSEMOTION

 pos, rel, buttons

 마우스가 움직일 때 발생함

 pygame.MOUSEBUTTONUP

 pos, button

 마우스 버튼을 누른 후 뗄 때 발생함

 pygame.MOUSEBUTTONDOWN

 pos, button

 마우스 버튼을 눌렀을 때 발생함

 pygame.JOYAXISMOTION

 joy, axis, value

 조이스틱 축이 변경되면 발생함

 pygame.JOYBALLMOTION

 joy, ball, rel

 조이스틱 볼이 움직이면(회전하면) 발생함

 pygame.JOYHATMOTION

 joy, hat, value

 조이스틱 hat이 바뀌면 발생함

 pygame.JOYBUTTONUP

 joy, button

 조이스틱 버튼을 눌렀을 때 발생함

 pygame.JOYBUTTONDOWN

 joy, button

 조이스틱 버튼을 누른 후 뗄 때 발생함

 pygame.VIDEORESIZE

 size, w, h

 디스플레이가 pygame.RESIZABLE 플래그로 설정되면, 사용자가 창 크기를 조정하기 위해 발생함

 pygame.VIDEOEXPOSE

 none

 화면의 일부를 다시 그려야 하는 경우 화면에 직접 그리는 하드웨어 디스플레이가 발생시킴

 pygame.USEREVENT

 code

 사용자가 임의로 설정하는 이벤트


위와 같이 다양한 이벤트 목록을 제공합니다.

우리는 여기서 pygame.QUIT의 이벤트에 대해 알아보도록 하겠습니다.

만약 다른 pygame 이벤트에 대한 자료를 참고하고 싶으시다면 아래의 링크에서 선택하시면 될 것 같습니다.



화면 활성화 이벤트 ACTIVEEVENT

키보드 입력 이벤트 KEYDOWN/UP

마우스 움직임 이벤트 MOUSEMOTION

마우스 클릭 이벤트 MOUSEBUTTONDOWN/UP




01. pygame.QUIT 이벤트 예제

pygame.QUIT은 게임 종료 버튼(창 닫기 버튼)을 클릭하게 되면 발생하는 이벤트입니다.

다음 예제를 먼저 살펴보도록 하겠습니다.

# 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
flag  = False
clock = pygame.time.Clock()
x     = 0
y     = 0
count = 0

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
            if count >= 15:
                done = True # Flag that we are done so we exit this loop
            flag = True
 
    # 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)

    # Drawing House 
    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)

    if flag == True:
        x     += 10
        y     += 10
        count += 1
        flag  = False
    pygame.draw.line(screen, BLACK, [0, 0], [x, y], 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()

위의 예제의 결과는 다음과 같습니다.





02. pygame.QUIT 이벤트 예제 설명

결과를 확인하셨다면, 어떤 원리인지 위의 예제의 특정 라인을 통해 자세히 설명해보도록 하겠습니다.


먼저 35번째 라인에서 39번째 라인을 보도록 하겠습니다.

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

35번째 라인에서는 pygame.event.get() 함수를 통해 사용자가 발생시킨 이벤트를 가져옵니다.

가져온 이벤트 중 하나를 event라는 변수로 생각하고, 해당 이벤트의 type을 검사합니다.

36번째 라인에서는 pygame의 이벤트 중 QUIT 타입인지 확인합니다.

해당 이벤트는 게임 창에서 닫기 버튼을 클릭했는지 여부에 따라 발생합니다.

그외의 37번째 ~ 38번째 라인은 무한루프에 빠지지 않도록 하기위해 제가 임의로 작성한 라인입니다.

이는 닫기 버튼을 15번 누르게 되면 꺼지도록 하기 위한 코드입니다.


56번째 라인에서 60번째 라인을 보도록 하겠습니다.

    if flag == True:
        x     += 10
        y     += 10
        count += 1
        flag  = False
    pygame.draw.line(screen, BLACK, [0, 0], [x, y], 5)

56번째 라인은 위의 39번째 라인에서 flag라는 변수를 True로 바꿨을 때 출력되도록 설정한 코드입니다.

한 번 클릭할 때마다 x좌표와 y좌표가 10씩 증가하는 모습을 보입니다.

그리고 증가하게되는 좌표에 의해, 한 번 클릭하면 선이 늘어나는 모습을 보여주기 위해 위와 같이 작성하였습니다.


여기서 중요한 것은, 36번째 라인에서 닫기 버튼을 눌렀을 때, 우리가 임의의 작업을 넣어줄 수 있음을 의미합니다.

원래 모든 프로그램은 닫기 버튼을 누를 때 닫아지는 기능을 수행하지만, 위와 같이 임의의 기능을 삽입하였을 때 프로그램이 닫히지 않고, 선이 늘어나도록 작성할 수 있음을 보여드리고 싶었습니다.

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의 기본 실행 구조와 사용법에 대해 간단히 알아보았습니다.

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


PyGame 모듈은 다양한 기능을 지원하는데, 그 중에서 여러가지 도형을 그릴 수 있는 메소드들을 소개하도록 하겠습니다.


00. PyGame 지원되는 도형

PyGame에서 지원되는 도형은 다음과 같습니다.

메소드

도형

설명

 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

 부드러운 선들

 화면에 부드러운 선을 여러 개 이어서 그립니다.


여기서는 pygame.draw.aalines를 이용하여 여러 개의 선을 그리는 방법을 살펴볼 것입니다.

만약 다른 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



01. pygame.draw.aalines 함수

pygame에서 지원하는 여러 개의 선 그리기 함수인 aalines 함수는 다음과 같은 인자값들을 받습니다.



 pygame.draw.aalines(Surface, Color, Closed, PointList, Blend=1)

  Draws a sequence on a surface. You must pass at least two points in the sequence of points. The closed argument is a simple Boolean and if true, a line will be draw between the first and last points. The Boolean blend argument set to true will blend the shades with existing shades instead of overwriting them. This function accepts floating point values for the end points.




변수 

설명

Surface

 pygame을 실행할 때 전체적으로 화면을 선언한 변수 값

Color

 선의 색깔로 (R, G, B)의 형태로 데이터의 값을 삽입함

Closed

 이어지는 여러 개의 선을 다 그리고 하나의 구역으로 설정할지 결정

PointList

 여러 개의 선을 그릴 위치들을 입력함

Blend

 Anti-Aliasing(부드러움) 설정 여부로, True 혹은 False를 입력함


위의 변수들은 예제 소스코드를 통해 설명하도록 하겠습니다.


02. pygame.draw.aalines를 이용한 여러 개의 선 그리기(예제)

먼저 소스코드를 살펴보면 다음과 같습니다.


Source

# 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("Drawing Rectangle")
 
#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)
     
    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)

    # Draw on the screen a RED lines from (0,80) to (50, 90) to (200, 80) to (220, 30) 
    # Closed = False, Blend = True,  1 pixel wide.
    pygame.draw.aalines(screen, RED, False, [[0, 80], [50, 90], [200, 80], [220, 30]], True)

    # Draw on the screen a BLUE lines from (100,180) to (150,190) to (300, 180) to (320, 130) 
    # Closed = True,  Blend = False, 1 pixel wide.
    pygame.draw.aalines(screen, BLUE, True, [[100, 180], [150, 190], [300, 180], [320, 130]], True)
     
    # 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()

전체적인 소스는 위와 같습니다.

이제 아래에서는 소스를 특정하여 나눠서 설명을 해보도록 하겠습니다.



Variable - Surface

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

먼저, 16번째 줄의 screen 변수를 보면, 해당 변수에는 화면 전체를 설정하기 위한 값이 들어가 있습니다.

화면을 새로고침 해주거나, 화면을 채워주거나 할 때 해당 변수를 이용합니다.

pygame.draw.lines 함수의 Surface는 이러한 화면 설정 변수를 넣어주시면 됩니다.


Variable - Color

# 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)

다음으로, 8 ~ 12번 라인을 보시면, Tuple 형태의 값이 설정되어 있는 것을 보실 수 있습니다.

세 개의 값이 0 ~ 255의 범위를 가지게 되는데, 이렇게 설정된 값이 색깔(RGB) 값으로 Color 변수가 들어갈 곳에 넣어주시면 됩니다.


Variable - Closed

    # Draw on the screen a RED lines from (0,80) to (50, 90) to (200, 80) to (220, 30) 
    # Closed = False, Blend = True,  1 pixel wide.
    pygame.draw.aalines(screen, RED, False, [[0, 80], [50, 90], [200, 80], [220, 30]], True)

    # Draw on the screen a BLUE lines from (100,180) to (150,190) to (300, 180) to (320, 130) 
    # Closed = True,  Blend = False, 1 pixel wide.
    pygame.draw.aalines(screen, BLUE, True, [[100, 180], [150, 190], [300, 180], [320, 130]], True)

먼저 42번째 라인과 46번째 라인을 살펴보면 False와 True로 되어 있는 인자값을 보실 수 있습니다.

42번째 라인의 값의 False일 경우는 빨간색 선으로 보시면 되고,

46번째 라인의 값의 True일 경우는 파란색 선으로 보시면 됩니다.




빨간색 선을 보면 하나의 구역으로 나눠지지 않고, 선분만 이어져있는 것을 볼 수 있습니다.

파란색 선을 보면 하나의 구역으로 나눠져서 선분들이 이어져 있는 곳을 사각형으로 만들어낸 모습으로 보입니다.

파란색 선처럼 구역을 Closed 하고 싶을 때는 True, 빨간색 선처럼 구역이 없이 선만 그리고 싶을 때는 False를 하면 됩니다.


Variable - Blend

    # Draw on the screen a RED lines from (0,80) to (50, 90) to (200, 80) to (220, 30) 
    # Closed = False, Blend = True,  1 pixel wide.
    pygame.draw.aalines(screen, RED, False, [[0, 80], [50, 90], [200, 80], [220, 30]], True)

    # Draw on the screen a BLUE lines from (100,180) to (150,190) to (300, 180) to (320, 130) 
    # Closed = True,  Blend = False, 1 pixel wide.
    pygame.draw.aalines(screen, BLUE, True, [[100, 180], [150, 190], [300, 180], [320, 130]], True)

42번째 라인과 46번째 라인을 보시면 두 함수의 Blend는 각각 True와 False인 것을 확인할 수 있습니다.

Blend는 Anti-Aliasing 즉, 부드럽게 선을 그려줄지에 대한 선택을 말합니다.

만약 True로 값을 설정하여 함수를 실행한다면, 그려지는 선은 매우 부드럽게 그려지게 됩니다.

반대로 False로 값을 설정하여 함수를 실행항다면, 그려지는 선은 그림판으로 그린 것처럼 부드럽지 않게 그려지게 됩니다.

기본적으로 Blend는 True로 설정되어 있습니다.

True와 False의 비교는 아래의 그림과 같습니다.



위의 그림은 lines를 사용하여 부드럽지 않은 선을 그렸을 때와 aalines를 사용하여 부드러운 선을 그렸을 때를 비교한 것입니다.

lines와 aalines의 차이는 Anti-Aliasing이 가능한가 안 한가의 차이점이라고 보실 수 있습니다.



03. 주의할 점

소스코드의 인자값을 보시면 아실 수 있겠지만, 해당 함수는 선의 두께를 지정해줄 수 없습니다.

즉, 기본적으로 선분의 길이가 1이라는 의미입니다.

부드러운 선, 부드럽지 않은 선 모두 두께가 1로 고정되어 있기 때문에, 부드러운 선을 그리고 싶으시다면, 두께가 1인 것을 감안하여 사용해야 합니다.


PyGame 모듈은 다양한 기능을 지원하는데, 그 중에서 여러가지 도형을 그릴 수 있는 메소드들을 소개하도록 하겠습니다.


00. PyGame 지원되는 도형

PyGame에서 지원되는 도형은 다음과 같습니다.

메소드

도형

설명

 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

 부드러운 선들

 화면에 부드러운 선을 여러 개 이어서 그립니다.


여기서는 pygame.draw.aaline을 이용하여 여러 개의 선을 그리는 방법을 살펴볼 것입니다.

만약 다른 draw 메소드를 참고하고 싶으시다면 아래의 링크에서 선택하시면 될 것 같습니다.




사각형 - pygame.draw.rect

삼각형 - pygame.draw.polygon

원 - pygame.draw.circle

타원 - pygame.draw.ellipse

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

선 - pygame.draw.line

여러 개의 선 - pygame.draw.lines

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



01. pygame.draw.aaline 함수

pygame에서 지원하는 여러 개의 선 그리기 함수인 aaline 함수는 다음과 같은 인자값들을 받습니다.



 pygame.draw.aaline(Surface, Color, StartPos, EndPos, Blend=1)

  Draws an anti-aliased line on a surface. This will respect the clipping rectangle. A bounding box of the affected area is returned as a rectangle. If blend is true, the shades will be be blended with existing pixel shades instead of overwriting them. This function accepts floating point values for the end points.




변수 

설명

Surface

 pygame을 실행할 때 전체적으로 화면을 선언한 변수 값

Color

 선의 색깔로 (R, G, B)의 형태로 데이터의 값을 삽입함

StartPos

 선이 시작하는 점을 말하며 [x, y]형태로 값을 삽입함

EndPos

 선이 끝나는 점을 말하며 [x, y]형태로 값을 삽입함

Blend

 Anti-Aliasing(부드러움) 설정 여부로, True 혹은 False를 입력함


위의 변수들은 예제 소스코드를 통해 설명하도록 하겠습니다.


02. pygame.draw.aaline를 이용한 여러 개의 선 그리기(예제)

먼저 소스코드를 살펴보면 다음과 같습니다.


Source

# 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("Drawing Rectangle")
 
#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)
     
    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)

    # Draw on the screen a GREEN line from (0,50) to (50, 80) 
    # 5 pixels wide.
    pygame.draw.aaline(screen, BLUE, [0, 50], [50, 80], True)

    # Draw on the screen a GREEN line from (0,100) to (150, 180) 
    # 5 pixels wide.
    pygame.draw.aaline(screen, GREEN, [0, 100], [150, 180], False)
     
    # 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()

전체적인 소스는 위와 같습니다.

이제 아래에서는 소스를 특정하여 나눠서 설명을 해보도록 하겠습니다.



Variable - Surface

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

먼저, 16번째 줄의 screen 변수를 보면, 해당 변수에는 화면 전체를 설정하기 위한 값이 들어가 있습니다.

화면을 새로고침 해주거나, 화면을 채워주거나 할 때 해당 변수를 이용합니다.

pygame.draw.lines 함수의 Surface는 이러한 화면 설정 변수를 넣어주시면 됩니다.


Variable - Color

# 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)

다음으로, 8 ~ 12번 라인을 보시면, Tuple 형태의 값이 설정되어 있는 것을 보실 수 있습니다.

세 개의 값이 0 ~ 255의 범위를 가지게 되는데, 이렇게 설정된 값이 색깔(RGB) 값으로 Color 변수가 들어갈 곳에 넣어주시면 됩니다.


Variable - StartPos, EndPos

    # Draw on the screen a GREEN line from (0,50) to (50, 80) 
    # 5 pixels wide.
    pygame.draw.aaline(screen, BLUE, [0, 50], [50, 80], True)

    # Draw on the screen a GREEN line from (0,100) to (150, 180) 
    # 5 pixels wide.
    pygame.draw.aaline(screen, GREEN, [0, 100], [150, 180], False)

먼저 42번째 라인과 46번째 라인을 살펴보면 리스트 형태의 값이 인자값으로 사용된 것을 보실 수 있습니다.

42번째 라인의 값을 예시로 살펴보면, Start_pos의 값인 경우 [0, 50]이고, End_pos의 경우 [50, 80]입니다.

Start_pos와 End_pos는 모두 [x, y]의 형태로 값을 삽입합니다.

Start_pos의 x축의 값은 0, y축의 값은 50

End_pos의 x축의 값은 50, y축의 값은 80

이라고 보시면 됩니다.


Variable - Blend

    # Draw on the screen a GREEN line from (0,50) to (50, 80) 
    # 5 pixels wide.
    pygame.draw.aaline(screen, BLUE, [0, 50], [50, 80], True)

    # Draw on the screen a GREEN line from (0,100) to (150, 180) 
    # 5 pixels wide.
    pygame.draw.aaline(screen, GREEN, [0, 100], [150, 180], False)

42번째 라인과 46번째 라인을 보시면 두 함수의 Blend는 각각 True와 False인 것을 확인할 수 있습니다.

Blend는 Anti-Aliasing 즉, 부드럽게 선을 그려줄지에 대한 선택을 말합니다.

만약 True로 값을 설정하여 함수를 실행한다면, 그려지는 선은 매우 부드럽게 그려지게 됩니다.

반대로 False로 값을 설정하여 함수를 실행항다면, 그려지는 선은 그림판으로 그린 것처럼 부드럽지 않게 그려지게 됩니다.

기본적으로 Blend는 True로 설정되어 있습니다.

True와 False의 비교는 아래의 그림과 같습니다.




03. 주의할 점

소스코드의 인자값을 보시면 아실 수 있겠지만, 해당 함수는 선의 두께를 지정해줄 수 없습니다.

즉, 기본적으로 선분의 길이가 1이라는 의미입니다.

부드러운 선, 부드럽지 않은 선 모두 두께가 1로 고정되어 있기 때문에, 부드러운 선을 그리고 싶으시다면, 두께가 1인 것을 감안하여 사용해야 합니다.






+ Recent posts