PYGAME을 가지고 게임을 만들어 보겠다고 이 정도까지 왔다면 상당한 열정을 가지고 있을 것이라 생각한다. 특히나 게임툴이 발달한 지금 시대에 구식이 되버린 모듈을 가지고 무언가 해볼려고 한다면 그것만으로도 대단한 열정이라 할 수 있다. 파이썬이라는 언어 자체에 대한 흥미가 있는 것이다. 확실히 파이썬은 그전까지의 언어에 비해서 다른 점이 있다. 일단 일반인들이 광범위하게 사용하고 있기 때문에 프로그래머들의 전유물이 아니다. 파이썬이야 말로 4차산업 시대의 인재양성을 위한 코딩이라 바라보는 시각도 많다.

 

 1인 게임이던지 아니면 게임회사에 들어가서 진지하게 게임을 개발하고 싶은 사람들이 있다. 많은 경우 유니티로 시작하는 것을 권장하고 있다. C#을 사용하기 때문에  파이썬보다 입문은 조금 더 어려울 수는 있다. 하지만 유니티의 강력한 기능들과 호환성을 생각하면 PYGAME보다 낫다고 생각한다. (대기업 제품이니까 당연한건가) 단 PC 사양이 좀 좋아야 한다. 워낙 기능이 많고 그래픽도 3D 장착이라 기본 로드부터 오래걸린다.

 

아무래도 파이썬 사용자와 C# 사용자를 프로그래머들을 하나의 큰 그룹으로 묶어버리면 무리가 생긴다. 프로그래밍을 하는 사람들은 세계에 수백만명이 있을텐데 개발툴에 대한 그들의 성향을 하나로 묶어버린다는 발상 자체가 지나치다.

 

그보다 도움이 되는 것은 자신이 어떤 성향인가를 먼저 아는 것이다. 아래 베스트 파이썬 게임엔진에 관한 글을 읽어보면 도움이 된다. 몇가지 추천과 선택방법에 대한 조언을 하고 있는데 파이게임은 프로토타입을 만드는데 유리하다는 점을 설명하고 있다.

베스트 파이썬 게임 엔진에 관한 글

 

1. 시스템 폰트 사용법과 텍스트 출력하기

파이게임은 텍스트를 바로 화면에 출력할 수 있는 수단이 없다. 무슨말이냐면 텍스트 출력체계가 없다는 것이다. 우리가 사용하는 운영체제는 키보드로 문자를 입력받아서 아스키 코드로 인코딩하고 출력시에 그 코드에 대응되는 문자로 디코딩을 한 후, 현재 선택된 폰트를 적용하여 화면에 표시한다. print 함수 처럼 콘솔에 출력을 해봤다. 그것들은 표준출력의 방식으로 출력하는 것이다. 한마디로 기본 체계가 잡혀있으니까 사용자는 순수한 글자만 입력해서 가져다 주면 된다.

 

텍스트의 출력

 

그런데 이런 게임엔진은 화면을 그래픽같은 멀티미디어 요소에 최적화 시키기 때문에 텍스트도 그 방식을 따라서 출력해야 한다.

 

파이게임에서 텍스트를 사용하려면 우선 폰트를 설정해야 한다. 폰트는 저작권에 민감해서 아무 폰트나 사용하면 문제가 될 수 있다. 인터넷에 배포할 목적이라면 저작권협회에서 내용을 읽어보고 안전한 폰트를 사용한다.

한국소프트웨어 저작권협회

상업적 이용가능 폰트 눈누사이트

 

상업적 이용 가능한 무료 한글 폰트 모음 사이트 눈누

상업적으로 이용할 수 있는 무료 한글 폰트를 모아 놓은 사이트 눈누

noonnu.cc

 

그건 그렇고 시스템 폰트를 사용하는 방법과 그밖의 온라인의 폰트를 사용하는 방법이 있다. 이 포스트는 시스템 폰트를 사용하는 법을 기술한다.

 

SysFont 로 시스템의 폰트를 가져온다. None은 default font이다. Font 객체를 리턴하고 다음줄의 render는 Surface 객체를 반환한다. Surface 객체는 이미지를 로드했을 때 썼던 방식이다. 뭔가 통하고 있다는 생각이 들면 맞다. 텍스트를 Surface 객체에 그려준다음 다시 screen 위에 옮기는 방식이다. 이미지와 폰트 도형 그리기가 다 일관성이 있다. 그러기 위한 정보로는 폰트의 정보(종류,크기,색상 등)와 좌표가 들어가야 할 것이다. 아래 세줄에는 그 내용들이 들어간다.

font1 = pygame.font.SysFont(None,30)
img1 = font1.render('HELLO WOLRD! 안녕하세요!',True,BLUE)
screen.blit(img1, (50,50))

헬로월드 텍스트

이를 표시하면 안타깝게도 한글지원이 안된다. 영문폰트 사용시 한글이 깨지는 경우가 많았다. 우리가 사용하는 운영체제에서는 한글이 잘 나오는 폰트인데 여기서는 나오지 않는다. 파이썬 자체의 한글 깨짐 현상에 대한 해결책은 있지만 파이게임에 대한 내용은 잘 없는 것 같다. 해결책은 복잡하게 유니코드 변환같은 생각은 접어두고 한글전용 폰트를 쓰는 것이다.

 

*사용자 폰트 Font 메소드

font2 = pygame.font.Font('Maplestory Bold.ttf',30)
img2 = font2.render('HELLO WOLRD! 안녕하세요!',True,RED)
screen.blit(img2, (50,100))

메이플 스토리의 폰트

SysFont 가 아니라 Font 메소드를 쓰면 사용자 폰트를 사용할 수 있다. 이 경우 경로를 명시하지 않으면 폰트파일은 같은 폴더에 있어야 한다. 메이플 스토리의 폰트는 상업용으로 사용가능하다고 표기되있다. 다만 CCL에 따라 원저자 출처등을 적어줘야 하는 경우가 있으니 자신이 사용할 폰트의 주의사항은 똑바로 읽고 사용한다. 무료로 사용가능하더라도 어떤 조건은 항상 붙어있다.

 

* 시스템 폰트 리스트

시스템 폰트를 사용하려면 어떤 이름으로 사용해야 하는지 모를 것이다. 폰트 이름을 알기 위해서 시스템에서 폰트리스트를 가져와야한다. 다음의 코드를 사용한다.


for i in pygame.font.get_fonts():
    print(i)

시스템 폰트 리스트

콘솔에 출력시키면 이름을 확인할 수 있다. 길어보이지만 복사해서 붙여넣으면 된다.

 

* 나머지 폰트들을 출력

파이게임 텍스트 출력과 폰트

다른 폰트의 출력도 비슷하다. 한가지만 더 확인하면 된다. 아까 폰트는 Surface 객체를 리턴한다고 했다. 그 말은 곧 Surface 객체의 get_rect를 사용할 수 있다는 것이다. 그렇게 되면 텍스트는 Surface 이기 때문에 도형과 이미지를 처리했던 것 처럼 조작할 수 있다.

 

font5 = pygame.font.SysFont('notosanscjkkrblack',50)
img5 = font5.render('HELLO WOLRD! 안녕하세요!',True,RED)
rect5= img5.get_rect()
pygame.draw.rect(img5,BLACK,rect5,1)
screen.blit(img5, (50,250))

이 코드는 시스템 폰트를 사용해서 Surface 객체를 리턴한다. Surface 객체 img5는 Rect 객체를 만든다. 이미지에서 사각형을 만들때와 다른 점은 screen 이 아니라 img5 인스턴스에 직접 그린다는 것이다. position 설정 방식의 차이가 있다.

 

 

 

*전체 소스코드

import pygame
from pyc import *
import time

SIZE = width,height = 800,600

screen = pygame.display.set_mode(SIZE)
screen.fill(C1_BLUE)

pygame.init()

# t0 = time.time()
font1 = pygame.font.SysFont(None,30)
# print('time needed for Font Creation : ', time.time() - t0)
img1 = font1.render('HELLO WOLRD! 안녕하세요!',True,BLUE)
screen.blit(img1, (50,50))

font2 = pygame.font.Font('Maplestory Bold.ttf',30)
img2 = font2.render('HELLO WOLRD! 안녕하세요!',True,RED)
screen.blit(img2, (50,100))

font3 = pygame.font.SysFont('batangbatangchegungsuhgungsuhche',30)
img3 = font3.render('HELLO WOLRD! 안녕하세요!',True,BLACK)
screen.blit(img3, (50,150))

font4 = pygame.font.SysFont('malgungothicsemilight',20)
img4 = font4.render('HELLO WOLRD! 안녕하세요!',True,BLUE)
screen.blit(img4, (50,200))

font5 = pygame.font.SysFont('notosanscjkkrblack',50)
img5 = font5.render('HELLO WOLRD! 안녕하세요!',True,RED)
rect5= img5.get_rect()
pygame.draw.rect(img5,BLACK,rect5,1)
screen.blit(img5, (50,250))

font6 = pygame.font.SysFont('notosansmonocjkkrregular',15)
img6 = font6.render('HELLO WOLRD! 안녕하세요!',True,BLACK)
screen.blit(img6, (50,350))

pygame.display.update()
for i in pygame.font.get_fonts():
    print(i)

running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

pygame.quit()

 

다음 포스팅에서는 텍스트 출력을 다루는 방법에 대해서 더 알아볼 것이다.

공유하기

facebook twitter kakaoTalk kakaostory naver band