파이게임은 파이썬의 멀티미디어 라이브러리로 이 모듈을 설치하면 파이썬으로 게임을 만들 수 있다. 멀티미디어에 최적화된 SDL(Simple DirectMedia Layer)를 파이썬으로 감싸는(Wrapper) 라이브러리이며 파이썬으로 설치해서 바로 실행해 볼 수 있다. 아래 설치는 윈도우10 기준이다.
일단 게임을 만드는 것은 꽤나 시간과 노력이 드는 일이다. 파이게임은 간단한 라이브러리이다. 그럼에도 게임이 갑자기 뚝딱 나오지는 않는다. 하지만 파이썬의 모토처럼 빠르게 개발 할 수 있다. 또한 게임제작의 원리를 알수 있다.
커맨드창에서 pip 명령어로 인스톨을 한다. (윈도우10 경우, 설치가 안되면 python 이 환경변수에 있는지 확인한다) 커맨드창은 윈도우10의 검색메뉴에서 cmd를 검색해서 나오는 명령프롬프트를 실행한다. (윈도우키+R도 가능)
pip 는 Python package들을 자동으로 설치해주는 도구이다. 커맨드라인이라 거부감이 들수도 있다. 하지만 환경변수만 제대로 설치되어 있으면 정말 쉽고 빠르게 설치해준다.
> python -m pip install pygame
설치 과정이 출력되며 시간이 조금 걸릴 것이다. 설치가 되있으면 위와 같이 출력한다. Python 만 기본으로 설치했다면 pygame은 별도로 설치해야 한다. 파이썬 가상환경을 만들면 각자 설치해야 한다.
자 그럼 파이썬의 모토 답게 바로 무언가 실행해본다. "Life is too short, you need Python"은 이럴때 쓰는 말이다. 뭔가 빨리 보고 싶다. 예제를 돌려보자.
import pygame
screen = pygame.display.set_mode((640,320))
pygame.init()
pygame.quit()
가로 640 세로 320의 윈도우 창이 잠깐 나왔다가 사라질 것이다. 코드 네줄로 윈도우창을 만들 수 있다. 하나씩 살펴보자.
*import 문 : pygame의 모듈을 import 한다. pygame의 클래스,메소드,멤버변수 들이 현재 name space (경로 같은 것이다. 현재 작업공간) 에 들어와 사용할 수 있게 된다. import가 수입이라는 뜻이 있다. 수출 수입 처럼 수입은 뭔가를 다른 외부에서 내부로 옮기는 작업이다.
import pygame
항상 콘솔에 파이게임 커뮤니티 정보를 표시한다.
*display 세팅 : 거의 대부분의 GUI 모듈이나 프레임워크는 display 세팅을 해줘야 한다. 현재 사용하는 윈도우의 해상도가 다를 수도 있을 것이다. 세팅한 가로 세로 값 크기로 pygame 창이 열린다. screen 에는 diplay의 Surface 객체(클래스)를 반환한다. 이 객체에 윈도우에 대한 정보가 들어있다.
screen = pygame.display.set_mode((640,320))
* 파이게임 init 함수와 quit 함수
pygame.init()
pygame.quit()
이름에서 짐작할 수 있듯이 게임을 초기화(initialize)와 종료(quit)하는 함수이다. 별다른 코드를 만들지 않았으므로 윈도우 창을 띄우고 종료한다. 속도가 빠른 컴퓨터에서는 화면에서 빠르게 사라질 수 있다.
*파이게임의 기본 뼈대(소스코드)
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((640,320))
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.quit()
sys.exit()
이제 위에 내용을 바탕으로 파이게임의 기본 뼈대를 만들어보자. 중간에 while문을 끼워 넣는다. 게임이 실행되는 동안에
항상 while문이 무한루프하게 된다. 루프를 벗어나면 파이게임은 종료되고 system은 exit 메소드를 호출하며 모든 자원을 OS에 반환한다. 즉 정상종료한다.
게임은 컴퓨터의 자원을 많이 사용하는 대표적인 앱이다. 반드시 게임이 끝나면 sys.exit()까지 모든 리소스를 돌려줘야 한다. 안그러면 메모리의 Leak 이 발생할 수 있다. 메모리 릭이 누적되면 결국 PC는 뻑이난다.
while 은 사용자가 발생시키는 온갖 종류의 이벤트를 실시간으로 대기하고 있다. 마우스 커서를 조금 까딱해도 전부다 확인되고 있는 것이다. 그러다가 오른쪽 상단의 X 표시를 클릭하는 순간 event.type 에 pygame.QUIT 상수가 대입이 된다. 그러면 run은 False로 변환되고 while문은 다음 턴에 종료된다.
무한 루프를 빠져나가는 순간 게임은 종료된다. 윈도우 게임을 많이 해본 사람들은 X버튼 클릭하면 게임이 종료된다는 것을 알고 있을 것이다.
파이게임의 루프는 위와 같다. 게임이 끝날때까지 while문에서 처리되야 하는 것들이다. 이벤트를 처리하고 게임의 상태를 업데이트 하고 화면을 다시 그려준다. 이 과정은 2D나 3D 상관없이 모든 컴퓨터게임의 구조이다. (네트워크 게임같은 다중이용 게임은 제외) 배그같은 게임에서 60FPS 라는 것은 1초에 60장의 이미지를 넘겨가며 보여준다는 것이고 게임루프가 1초에 60번 발생된다는 것을 의미한다.
flip book 이란 애니메이션 기법 처럼 컴퓨터는 1초에 60장의 이미지를 계속 그린다. 인간의 뇌는 그것을 보고 캐릭터가 이동하고 배경이 움직이는 것과 같이 인식하게 된다. 이것에 반응하여 키보드나 마우스로 입력을 한다. 그러면 다시 컴퓨터가 이벤트를 처리하고, 업데이트 후에 스크린에 그린다. (하나만 그리는게 아니라 스크린 전부를 그린다)
얼마나 많은 일이 일어나고 있는지 우리는 상상하지 못한다.
게임을 제작하려면 알아야 한다.
비디오 게임이란게 무엇인가? 뿅뿅뿅 하는 것일까? 맞다. 실제로 그런 비슷한 소리나는 고전게임들이 많다.
비디오 게임이 TV와 다른 점은 화면의 내용에 사용자가 즉각적으로 반응하는 것에 있다. (Interface) 한쪽이라도 작용을 멈추면 게임은 끝난다.(Game over) 마우스를 누르건 키보드를 누르건 그것에 대한 표시를 해주고 컴퓨터는 지금까지 플레이어(유저)가 한 선택에 대한 평가를 한 후, 사용자의 다음 액션에 대해서 평가하고 그에 반응한다.(반응 하는 것처럼 보인다.) 즉 사용자의 선택에 대한 반응을 알고리즘으로 끌고나가는 것이다. 끓임없는 경우의 수가 있겠으나 대체적으로 인간의 인식과 조작능력의 범위에서 이루어진다.
기계와의 상호작용은 게임이 원조겠지만, 윈도우라는 GUI 환경도 뜯어보면 꽤 비슷한 일을 한다. 다만 게임의 조건을 끓임없이 생산하는 알고리즘은 아니다.
(그래서 일반 프로그램은 지루하다, 우리는 끓임없는 자극을 원한다구!)
윈도우창의 GUI는 이벤트 처리기라는 것을 통해서 사용자와 상호작용한다. 비단 pygame 뿐 아니라 GUI도 마찬가지다. 사람이 윈도우에게 무언가 행동을 하면 윈도우는 GUI를 통해서 반응을 하고, 이 과정이 무한히 반복된다. 이런 반복을 Event Loop 이벤트 루프라고 한다.
Event Loop 가 대단히 중요한 개념인데도 대부분 책이나 튜토리얼에 설명이 빈약하다.
GUI 책들이 대중적인 인기가 없어서 그렇다
윈도우창을 기계라고 한다면 항상 켜놓고 대기시켜 놓는 것이다. 인간이 어떤 조작을 할 때까지 기다린다. 이벤트가 생길때까지 기다린다. 기계니까 가능한 것이다. 사람이면 안 기다리겠지...
모든 이벤트는 사용자의 요구사항인데, 당연히 기계가 이해 가능한 범위의 요구만 할 수 있다. 그래서 이벤트 처리기에 사람이 하는 조작의 종류를 대체적으로 정해놨다. 마우스와 키보드를 가지고 사용자가 뭘할것인지 웬만하면 예측이 가능하다. 그리고 FPS나 전략시뮬같은(배그,롤) 게임에서 캐릭터들을 어떻게 조작했는지 생각해보면 쉽게 이해할 수 있다.
1) Mouse 의 움직임 : 마우스를 이동하고, 클릭하고, 드래그하고, 마우스를 누르고 있고, 마우스를 눌렀다 떼고, 휠마우스를 돌리고 하는 행동이다.
2) 키보드 입력 : 키보드를 눌렀을 때, 떼었을 때, 두개를 동시에 눌렀을 때 등의 행동이다.
3) 조이스틱 입력 : 조이스틱은 디지털과 아날로그가 있다. 요새는 VR 콘트롤러 등 다양한 조이스틱이 출시된다. 요새 PC에서 기본으로 잘 잡히는 것은 XBox용 USB 컨트롤러가 있다. 조이스틱에 미리 정의된 행동을 말한다.
파이게임에서는 마우스나 키보드등 기본적인 입력이 정의되어 있다. 사용자는 라이브러리를 활용하여 이벤트 처리기를 정의하기만 하면 된다.
예제는 이벤트 루프를 하는 동안 파이게임 내부에서 일어나는 일을 보여준다.
import pygame
screen = pygame.display.set_mode((640,320))
pygame.init()
running =True
while running:
for pyEvent in pygame.event.get():
print(pyEvent)
if pyEvent.type == pygame.QUIT:
running = False
pygame.quit()
코드 해설은 다음과 같다.
import 문은 pygame 모듈을 가져온다. display 세팅을 한 후 pygame.init() 으로 초기화 시킨다. 이 시점에서 파이게임 윈도우가 만들어진다.
Event Loop 즉 무한루프를 만들기 위한 변수 running 을 설정한 후 while 로 무한 루프에 들어온다.
event를 조작하는 방법은 간단하다. 사실 pygame.init() 이 윈도우창을 열었을 때부터 이벤트는 발생하고 있었다. for 이벤트 루프에서 그 내용을 콘솔에 표한다. pyEvent in pygame.event.get(): 로 발생한 이벤트를 잡아서 pyEvent에 넘긴다.
그냥 마우스로 윈도우창 위에서 몇초간 흔드는 것으로도 500회의 이벤트가 발생한다. 이벤트가 발생할 때 마다 python에게 어떤일을 시킬 것인가를 결정하고 구현하는 것이 게임개발자의 일이다.
이렇게 개발자가 그래픽 구현이나 인터페이스 같은 H/W나 운영시스템 부분에 대해 신경쓰지 않고, 본연의 비지니스 로직에 집중할 수 있게 만들어 주는 도구를 프레임워크라고 한다. Pygame은 많은 사람들이 사용하는 프레임워크이다.
이번 포스트는 여기까지 한다. 파이게임에 대해 추가적인 포스팅이 있을 것이다.
<파이게임 개발을 위한 참고자료 - 초급>
* 알 스웨이가트의 파이게임 강의
https://inventwithpython.com/pygame/chapter2.html
* 파이게임 튜토리얼
https://pygame.readthedocs.io/en/latest/1_intro/intro.html#import-the-module
* 파이게임 DevDocs 자료가 깔끔하게 정리되었다. 최근에 리뉴얼 된것인지 그전에 보지를 못했다.
* 파이게임 제작자의 공식 홈페이지
* Read the Docs PDF 문서
* 파이게임 Documentation 공식 홈페이지
http://cs.roanoke.edu/Fall2013/CPSC120A/pygame-1.9.1-docs-html/index.html
* 파이게임 튜토리얼 영상(슈팅게임)
https://www.youtube.com/watch?v=FfWpgLFMI7w
* 간단한 피하기 게임
*웹사이트 (피하기 게임)
*웹사이트 튜토리얼(real python)
워낙 많은 튜토리얼이 있다. 위쪽의 웹사이트들은 가장 기본적인 내용들이라 반복이 많을 것이다. 익숙해질때까지는 반복이 중요하다.
아래의 영상으로 공부하면 초급에서 중급으로 가는 징검다리가 될 것이다. Sprite 객체 사용법 부터 정석으로 알려준다.
클래스를 사용하여 코딩을 한다. shumup (갤러그 같은 슈팅게임) 튜토리얼이다. 필자가 본 것 중에 파이게임 클래스에 대한 설명을 가장 잘하는 것 같다. (영어임을 참고)
* 파이게임 다음 포스팅