파이게임 기초
목차
이번 포스팅에서는 파이게임 기초를 알아보겠습니다.
게임창 설정
먼저 파이썬 IDLE 에서 시작하겠습니다.
>>> import pygame pygame 2.0.1 (SDL 2.0.14, Python 3.9.1) Hello from the pygame community. https://www.pygame.org/contribute.html
파이게임의 모듈을 가져오면 게임을 만들기 위한 여러가지 함수나 클래스를 사용할 수 있습니다. 모듈만 가져온다고 게임이 진행되는게 아니라 초기화를 시켜야합니다.
>>> pygame.init() (7, 0)
초기화 함수인 init()은 튜플을 반환합니다. (7, 0) 은 7개의 구성요소들을 초기화하고 실패한 초기화가 0개라는 의미입니다. 구성요소란 키보드, 사운드 처럼 게임에 사용할 하드웨어 입니다. 초기화가 실패하면 파이게임이 제대로 실행되지 않습니다.
파이게임이 작동하지 않을 경우 이 반환값을 확인하여 디버깅합니다.
그 다음은 화면의 사이즈를 설정하겠습니다. 가로와 세로 비율 (width 와 height)을 튜플로 만들어서 사용합니다. 사이즈는 픽셀단위입니다.
>>> size = (500, 400)
500×400 창을 생성합니다.
set_caption 함수는 윈도우의 title을 변경합니다. title 은 상당의 텍스트를 말합니다.
>>> pygame.display.set_caption('I am PyGame')
계속해서 IDLE 를 사용하여 프로그래밍을 해나갑니다. 이번에는 배경화면을 바꿔봅니다. 튜플로 RGB 값을 만들어서 아까 받은 surface 객체인 screen의 fill 함수에 전달합니다. 여기까지만 하면 surface 객체만 변경한 것이고 update 함수까지 해야 실제 색이 바뀝니다. update는 surface의 변화를 비디오에 반영하는 함수입니다.
>>> WHITE = (255, 255, 255) >>> screen.fill(WHITE) <rect(0, 0, 500, 400)> >>> pygame.display.update()
RGB는 컴퓨터에서 색을 표현하는 값을 정한 것인데 Color Picker 로 구글에 검색하면 색을 고를 수 있는 사이트가 많이 나옵니다. 흰색이 아니라 마음에 드는 색을 골라 배경색을 칠해보세요.
HTML Color Picker (w3schools.com) 칼라 픽커 링크
여기서 진도를 더 나가보겠습니다. 화면에 선을 그리는 함수를 사용해 보겠습니다.
컴퓨터 좌표계
게임창의 화면을 컨트롤하기 위해서는 좌표의 규칙을 알아야합니다. 2차원 평면을 수학에서 데카르트 좌표라고 합니다. 수학에서 보는 좌표와 컴퓨터에서 보는 좌표의 차이점을 보겠습니다.
수학의 좌표가 보통 좌측 하단에서 우측 하단으로 증가하는 반면 컴퓨터에서는 좌측 상단에서 우측 하단으로 증가합니다. 아래의 이미지가 컴퓨터의 좌표계를 나타내고 있습니다. (0, 0)이 좌측 상단에서 시작하는 것을 확인합니다.
컴퓨터의 좌표계에서 어떤 대상을 그려보겠습니다. 다시 IDLE 로 돌아갑니다.
파이게임 그리기 함수 (Line, Rect)
>>> pos1 = (0, 0) >>> pos2 = (500, 400) >>> GREEN = (0, 255, 0) >>> pygame.draw.line(screen, GREEN, pos1, pos2) <rect(0, 0, 500, 400)> >>> pygame.display.update()
시작좌표와 끝좌표를 설정하고 색상을 고른 후 선을 그립니다. 상당히 직관적인 코드입니다. 사실 윈도우에서 그래픽을 그리는 많은 함수들이 취하는 매개변수가 거의 비슷합니다. 그릴 대상과 좌표, 색상만 있으면 그릴 수 있습니다.
스크린에서 모든 그리기 활동은 직접적으로 화면에 그리는게 아닙니다. screen surface에 그리는 것은 백버퍼(back buffer)라는 메모리에 그림을 복사해두는 것입니다.
정확한 설명은 화면을 표시하고 있는 display memory가 있고 그림을 그려둔 back buffer 가 있습니다. display memory 와 back buffer 를 교체함으로써 새로운 화면이 표시됩니다.
이를 표시하는 두개의 함수가 있는데
pygame.display.flip()과 pygame.display.update() 입니다.
flip 은 말 그대로 메모리를 뒤집습니다. display memory 와 back buffer 가 바뀝니다. update 는 전체를 업데이트하는 함수입니다. 거의 같은 의미로 사용합니다.
다음의 코드는 사각형을 그립니다. 매개변수가 약간 다른데 좌표 + 너비, 높이입니다.
>>> pygame.draw.rect(screen, GREEN, (50, 50, 100, 70)) <rect(50, 50, 100, 70)> >>> pygame.display.flip()
이제 어느정도 감을 잡을 수 있을 것입니다. 컴퓨터의 GUI그리기 함수의 형태는 거의 비슷합니다. 좌표가 대각선 아래로 내려가고 사각형은 두개 좌표로 그릴 수 있습니다.
마우스 이벤트 검사
파이썬 IDLE를 나와서 소스코드 에디터를 사용합니다.
IDLE와 다르게 들여쓰기에 주의해야 합니다. 들여쓰기 하나에 공백문자 4칸이 기준입니다.
import pygame import sys screenSize = (400, 300) gameScreen = pygame.display.set_mode(screenSize) pygame.init() running =True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.MOUSEBUTTONDOWN: print(event) elif event.type == pygame.MOUSEBUTTONUP: print(event) pygame.quit() sys.exit()
while 문 안의 event.get 함수는 매번 발생된 이벤트의 내용을 정리해서 event 변수에 저장합니다. 마우스를 버튼을 클릭하고 떼면 이벤트가 발생합니다.
사실 이벤트의 내용이 뭔지는 모르지만 결과값을 보고 대충 추측할 수 있습니다. pos 는 좌표를 말하고 202, 86같은 숫자는 마우스의 위치입니다. button 1은 왼쪽 마우스 클릭을 뜻하고 window 는 윈도우에서 일어난 일임을 알 수 있습니다.
<Event(1025-MouseButtonDown {'pos': (202, 86), 'button': 1, 'window': None})> <Event(1026-MouseButtonUp {'pos': (202, 86), 'button': 1, 'window': None})>
이벤트의 발생속도는 보통 스크린 업데이트 주기인 60FPS에다 맞춰서 넣습니다.
이벤트가 발생하면 이에 대응하는 이벤트액션 코드를 작성하면 유저의 입력과 상호작용할 수 있게 됩니다.
요약
본격적으로 파이게임 프로그래밍을 하기 전에 파이게임 기초에 대하여 알아봤습니다. 사실 1초에 60번 게임루프니 이런 이야기를 들어도 잘 와닿지가 않습니다.
그럴때 제일 좋은 방법은 코드를 여러번 실행해보고 약간의 수정을 가해보면 원리를 깨우치는데 도움이 많이 됩니다.
외부참조링크
Pygame Front Page — pygame v2.0.1.dev1 documentation 파이게임 기초