게임을 제작하는 것은 쉬운 일이 아니라는 말을 해둬야겠다. 물론 요즘은 툴이 워낙 잘 나와서 인터넷의 포스트 한 두개 읽고 소스코드를 복붙하여 실행시킬 수 있는 게임들도 많다. 그러한 툴을 찾는 다면 굳이 파이게임을 사용하여 만들 필요가 없을 것이다. Steam 에는 다양한 게임 툴을 팔고 있다. 그 중에는 온라인 배포까지 할 수 있는 툴도 꽤 많이 있다.

 

 

파이게임 커뮤니티에는 오픈소스로 개발된 게임들이 많이 있다. 요즘 게임 스타일은 아니지만 수천개의 게임이 공개되있다. 최초에 Pete Shinner 에 의해 개발된 pygame의 커뮤니티에 가면 오픈소스의 게임들을 다운로드 받을 수 있다. 아마추어 게임들이나 다양한 시도는 아직도 이루어지고 있다.

 

오픈소스 파이게임

파이썬으로 제작한 둠

 

*파이게임 커뮤니티 링크

 

https://www.pygame.org/news

TLDR; Some highlights. Every single source file has been heavily modified and moved in this release. Initial (source code only) support for SDL2 has been merged in. We also support compiling with SDL1 in the same code base, so the migration to pygame 2 is

www.pygame.org

파이게임의 커뮤니티가 꾸준한 것은 오픈소스 개발자들이 딱히 상업용 게임을 개발하려는 것보다는 파이썬 자체의 간결함, 강력함과 SDL의 탁월한 성능을 계승한 파이게임 모듈을 만난 효과라 볼 수 있다. 개발자들은 코딩이 지루한 작업이 아니라 즐길 수 있는 놀이라고 생각하게 되었다.

 

유튜브에는 파이게임으로 10분 정도에 테트리스 같은 고전게임을 코딩하는 영상도 있다. 마치 2시간 걸리는 요리를 5분안에 보여주는 유튜브 영상처럼 미리 다 준비되어 있는 라이브러리 리소스와 알고리즘을 가지고 진행할 뿐이지만, 그 자체가 많은 사람들에게 놀라움과 즐거움을 주는 것은 사실이다. 사람들은 테트리스를 정말 좋아하기 때문이다.

 

이 블로그는 새로운 기술에 대해 논할 때 잡설이 길다. 왜냐하면 이해가 안되는 코드들을 적어놓는 것을 별로 좋아하지 않기 때문이다. 그런 것은 몇몇 직업군에 있는 사람들에게만 어필할 수 있다.

 

수십억 명이 이해할 수 있는 영문 포스트라면 모를까 이 블로그는 IT기술에 대한 한글 포스트기 때문에 더욱 관련된 사람의 숫자가 적을 것이다. 당연한 이야기지만 IT기술과 관련된 포스트의 숫자는 대략 7000만이 사용하는 한국에 비하여 130개 국가 11억의 인구가 사용하는 영어가 압도적이다. 이것이 의미하는 바가 더 중요하다. 130개의 국가에서 영어를 기반으로 각자 자신들의 사회제도안에서 IT시스템을 구축한 노하우가 생긴다는 것이다. 단일 민족 국가인 한국의 IT 시스템에 비하면 가지수가 많다. 이것이 다른 모든 기술도 마찬가지 겠지만 IT기술에 있어서 영어의 중요성을 말해준다.

 

과거 중국이 무섭게 경제성장하던 시절, 영어의 세계언어로써의 위상을 의심하던 때가 있었으나 그렇지 않다. 영어의 파워는 더욱 강해질 것이다. 언어의 유산이란 것은 쉽게 대체되기 어렵다. 그리고 빨리 배워지지 않는다. 일단 컴파일러가 알아듣는 언어는 영어이다. 컴퓨터가 새로운 언어를 배울려면 인간이 학습을 시켜줘야 한다. 영어를 그만 쓰게하고 다른 언어를 알아듣게 하기엔 마땅한 언어가 없다. 한글은 인구수를 봤을 때 처음부터 고려대상이 아니었다. 중국어? 한자의 개수가 수십만개에 달하는 중국어로 IT용어를 다 바꿀까? 글자수만 4바이트를 잡아둬야하는 중국어는 1바이트에 담길 수 있는 아스키코드에 비하면 효율적이지가 않다. 사실 아스키코드는 문자를 표현하기 위해 7비트 밖에 필요가 없다. 나머지 1비트는 확장 아스키 코드다. 

 

글쓴이도 한때 세계의 패권이 중국에 넘어갈지 모르니 중국어를 배워야 한다고 생각하던 시절이 있었다. 그런데 요즘 보니 그렇지는 않을 것 같다. 중화권 인구가 많으니 사람들의 문화나 생활방식을 이해할 필요는 있다고 생각하지만 먹고 살기위해 중국어를 완벽히 구사할 필요는 없다고 생각한다.

 

어쨋든 영어의 중요성에 대해 설명하기 위해 길게 내려왔다. IT기술과 코딩을 배우기 위해서는 영어가 그만큼 중요하다는 것을 역설하기 위해서 였다. (이 블로그에서는 그런 내용의 잡설이 특히 길다)

 

파이게임 배경화면 조작하기

 

잡설이 길기 때문에 예제는 간단하다. 파이게임으로 배경화면 색상을 조작하는 예시이다.

import pygame as pyg
from pygame.locals import *

BLACK = (0,0,0)
WHITE = (255,255,255)

RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

YELLOW = (255, 255, 0)

C1_BLUE = (204, 204, 255) # Custom blue color 1

key_dict = {K_k:BLACK, K_r:RED, K_g:GREEN,K_b:BLUE,K_y:YELLOW,K_w:WHITE}
print(key_dict)


screen = pyg.display.set_mode((800,600))
bgColor = C1_BLUE
caption = 'BG Color : ' + str(bgColor)
pyg.display.set_caption(caption)
screen.fill(bgColor)
pyg.display.update()

pyg.init()

running = True
while running:
    for pyEvent in pyg.event.get():
        if pyEvent.type == KEYDOWN:
            if pyEvent.key in key_dict:
                bgColor = key_dict[pyEvent.key]
                caption = 'BG Color : ' + str(bgColor)
                pyg.display.set_caption(caption)
            else:
                bgColor = C1_BLUE
                
        if pyEvent.type == pyg.QUIT:
            running = False
        screen.fill(bgColor)
        pyg.display.update()

pyg.quit()

그렇다. 포스트 1보다 소스코드가 좀 더 길어졌다. 소스코드가 길어지면 읽기 싫어지는 부작용이 생긴다. 그러나 천리길도 한걸음부터 가면 어떻게 간건지는 몰라도 목표지점에는 도착한다. 하나씩 읽어본다.

import pygame as pyg
from pygame.locals import *

import 패키지가 무엇인지는 계속 말하고 있다. import는 파이썬의 특징이기도 하다. C언어의 include "헤더파일" 하고 비슷하다고 보면된다. 파이게임 관련된 포스트 1에서 pygame 패키지를 설치했다. 설치한 pygame 모듈을 지금 내가 사용하는 namespace로 가져오는 것이다. namespace는 말그대로 '이름공간'이다.

 

pygame 임포트

 상단과 같이 pygame을 import 한다. 그러면 아래 dir()로 현재 namespace에 'pygame' 이 추가된다. 이것은 pygame 모듈을 불러와서 사용가능하다는 것이다. pygame.init() 도 여기에 연결된다. as pyg 라고 한 것은 pyg 와 pygame은 똑같이 취급한다는 말이다. pyg 라고 바꾼것은 길어서 바꾼 것이다. 이제 pyg.init()로도 윈도우창을 생성할 수 있다.

 

자 그럼 from pygame.locals import * 은 무엇인가? 처음 보면 무슨 의민지 모르겠는데 다음을 보면 알 수 있다.

 

pygame.locals

갑자기 local namespace에 상수들이 꽉차있다. pygame 모듈에 들어있는 locals 파일에는 파이게임에 쓰이는 상수들을 정의해두었다. import * (ALL) 은 여기 있는 모든 상수들을 지금 이름공간에 불러와서 사용하겠다는 것이다. 원래는 pygame.locals.KEYDOWN 이라고 써야할 곳에 KEYDOWN 만 써도 된다는 말이다. 이것을 왜하냐면 메인코드를 간결하게 하기 위해서이다. 라이브러리는 복잡하다. 온갖 것들(범용성의 코드)이 들어있어야 한다. 그런데 소스코드에 내가 사용하지 않는 코드까지 포함시켜야 한다면 낭비가 된다. 저장공간, CPU, 네트워크 등에서 낭비가 발생할 것이다.

 

지금 namespace에 불러온 것들은 이유가 있다. 이런 스타일이 마음에 들지 않으면 'pygame.locals.파이게임상수' 처럼 사용해도 무관하다. 다만 소스코드는 길어지고 가독성이 떨어진다는 점을 염두해둔다.

 

*Python의 namespace가 뭔지 알고 싶다면 읽어보자. 상당한 도움이 된다.

LINK: What are python namespace

 

What Are Python Namespaces (And Why Are They Needed?)

Name conflicts happen all the time in real life. For example, every school that I ever went to had at least two students in my class who shared the same first name. If someone came into the class...

code.tutsplus.com

* 색상설정

BLACK = (0,0,0)
WHITE = (255,255,255)

RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

YELLOW = (255, 255, 0)

C1_BLUE = (204, 204, 255) # Custom blue color 1

RGB 코드라는 것을 들어봤는가? 색의 삼원색에 대해서는? 컴퓨터의 색상을 표기하는 방법도 같다. 

 

세개의 색상을 조합해서 사용한다. RGB값은 각각 1byte (0~255) 범위를 지정할 수 있다. 16진수 표현은 0x00~0xFF 이다. 0부터 255까지 그 색상의 레벨을 표현하는데 255가 가장 큰 값이다. 예를들어 (255,0,0) 는 (R,G,B) 니까 빨간색(RED)이다. (0,255,0)은 녹색(GREEN), (0,0,255)는 파란색(BLUE). 이 삼원색을 섞은 값도 마찬가지다. 그림에서 빨간색과 초록색 중간은 노란색(YELLOW)이다. 즉 (255,255,0) 이다. RGB Color로 표현할 수 있는 색상은 16만개 (2의24승) 이며 삼원색의 조합으로 나타낸다.

 

보통사람이면 16만개 색상중에 사용하는 것은 몇십개 안될 것이다. PC 초기에는 모니터 성능이 지금처럼 좋지 않았다. 아래 유튜브 영상을 보면 무슨 차이인지 짐작할 수 있다. (이 그래픽 데모를 보며 가슴이 설레면 아재일 가능성이 높다)

 

허큘리스 CGA EGA VGA 유튜브 링크

 

*쓰고 싶은 색상을 쉽게 고르는 방법이 있다. 아래의 웹에서 색상을 고르면 RGB코드를 알려준다. HTML 용이라지만 RGB는 PC모니터를 쓰면 다 똑같다.

 

*색상 선택 링크

 

HTML Color Picker

Selected Color: Black Text Shadow White Text Shadow

www.w3schools.com

RED = (255,0,0) 의 코드를 보면 튜플로 상수를 만들었다. (튜플은 리스트처럼 값이 변하지 않는다) 메인 이벤트 루프에서 굳이 255,0,0 을 입력할 필요없이 RED 로 통일하면 의미가 잘 통한다. 상식적으로 255,0,0 을 RED 로 읽진 않을 것이다. (많이 숙련된 프로그래머는 가능하긴 하다...) 그래서 미리 사용할 색상들을 소스코드의 앞쪽에 설정해 놓는다.

 

key_dict = {K_k:BLACK, K_r:RED, K_g:GREEN,K_b:BLUE,K_y:YELLOW,K_w:WHITE}
print(key_dict)

딕셔너리 형태로 색상키를 묶는다. (바인딩)

 

색상키

107 은 아스키 코드로 lowercase k 이다. 즉 키보드의 k이다. k값에 BLACK (삼원색이 모두 0인 것) 을 저장한다. 이런식으로 딕셔너리에 키보드을 넣으면 삼원색을 찾을 수 있게 해놨다.

 

screen = pyg.display.set_mode((800,600))
bgColor = C1_BLUE
caption = 'BG Color : ' + str(bgColor)
pyg.display.set_caption(caption)
screen.fill(bgColor)
pyg.init()

이제부터는 pygame을 구동시킨다. 먼저 디스플레이 모드(해상도)를 설정해준다. 800x600, 640x240 등으로 설정한다. 초기 설정은 모니터 설정에 따라 될 것이다. 배경색상의 기초값은 BLACK = (0,0,0) 이 자동 지정된다. bgColor는 백그라운드 칼라 설정에 쓰인다. caption은 pygame 창의 상단 타이틀이다. screen.fill 동작에서 백그라운드 칼라를 채운다. 이제 init() 로 초기화를 시작하면 pygame 창이 뜬다.

 

running = True
while running:
    for pyEvent in pyg.event.get():
        if pyEvent.type == KEYDOWN:
            if pyEvent.key in key_dict:
                bgColor = key_dict[pyEvent.key]
                caption = 'BG Color : ' + str(bgColor)
                pyg.display.set_caption(caption)
            else:
                bgColor = C1_BLUE
                
        if pyEvent.type == pyg.QUIT:
            running = False
        screen.fill(bgColor)
        pyg.display.update()

pyg.quit()

이벤트 처리기로 들어가보자. 파이썬의 이벤트는 while루프 안에서 event.get( ) for 루프를 돈다. 이벤트가 딱히 발생하지 않으면 다음 코드를 실행할 수도 있다. 여기서는 for문만 사용했다. 결국 event.get( ) 이 발생하면 이벤트 객체에 대한 정보를 반환한다. type을 검사하면 어떤 이벤트 인지 알 수 있다. KEYDOWN은 아까 pygame.locals 에서 가져온 상수이다. KEYDOWN 이벤트면 어떤 키를 눌렀는지 검새를 해야한다. 위에서 저장한 딕셔너리에서 키값을 가지고 가져온다. 예를 들어 r키를 눌렀다면 RED = (255,0,0) 를 찾아와서 bgColor에 대입한다. caption은 선택한 칼라값을 타이틀바에 출력한다.

 

YELLOW
GREEN

screen 객체에 백그라운드 설정을 하고 display.update하는 과정을 거친다(정확히는 전체화면을 다시 그려준다.) 다시 for루프로 돌아가서 더이상 event가 없으면 while루프로 돈다. 마지막 코드에는 x버튼을 클릭하면 종료할 수 있도록 해놨다. 

 

소스코드의 설명은 여기까지다. 2에서는 특정 키보드 이벤트가 발생했을 때 실제 윈도우창을 변화시키는 과정이었다. 백그라운드 색상을 변화시킬 수 있으면 이미지나 다른 그래픽적인 요소도 활용할 수 있다.

 

게임을 할 때 사용자가 무엇을 하는지 생각해보는 것이 도움이 된다. 여전히 많은 게임들의 UI는 키보드와 마우스이다. 최근에는 VR게임 인터페이스가 나와서 그게 좀 혁신적이긴 한데 가격이 비싸서 대중화가 되려면 아직 멀었다. 다시말해 아직 키보드와 마우스만으로도 얼마든지 재미있게 게임을 즐기는 시대라는 것이다. 스마트폰의 터치기능이 있지만 파이썬은 스마트폰 앱에 대한 지원이 아직까지 부족하다. 그건 유니티나 안드로이드 스튜디오 쪽으로 알아보는게 더 나을 것이다.

 

다음 포스트에 좀더 진전된 내용을 다룰 것이다.

공유하기

facebook twitter kakaoTalk kakaostory naver band