[pygame] Cannon 게임 프로젝트 3 - 텍스트 표시

 제작 로그 3 - 화면에 텍스트 표시 

pygame에서 모든 이미지는 surface 에 그려집니다. surface 는 이미지를 그리는 도화지 같은 것이라고 생각하시면 됩니다. 

게임이 표시되는 화면도 surface 이고 화면에 표시되는 이미지도 읽어들이면 surface 객체로 생성됩니다. 

따라서 텍스트도 surface 로 만들어져서 화면에 표시됩니다.

화면에 텍스트를 표시하기 위해서는...

1. font = pygame.font.SysFont("notosanscjkkr",30)
2. text_start = font.render("게임을 시작하려면 's' 키를 누르세요.",True,(0,255,0))
3. background.blit(text_start,(150,300))

위의 3 과정을 거칩니다. 

1번은 폰트 객체를 생성하는 것 입니다. 

2번은 텍스트가 표시된 Surface 를 만드는 것이고요.

3번은 화면에 표시되는 Surface 에 텍스트 이미지가 들어간 Surface 를 복사해 넣는 것입니다. 이 3번은 이전에 이야기 했던 while 문(게임의 메인루프)에 작성해야 합니다.

 각 순서에 대한 자세한 설명은 아래에서 하나씩 하겠습니다.

>

1번 폰트객체의 생성방법은 2가지가 있습니다. 

첫째는 위와 같이 system 폰트를 이용하는 방법이고요. 

두번째는 직접 폰트 파일을 읽어들여서 사용하는 방법입니다. 

 *시스템 폰트란 OS 에 등록되어 있는 폰트를 말합니다. 이 경우는 등록된 이름만 알면 위의 예처럼 바로 사용할 수 있습니다. 시스템이 등록된 폰트는 pygame 의 font 객체의 get_fonts() 함수로 구할 수 있습니다.

 *폰트파일을 직접 읽어들이는 방법은 외부에서 다운받은 ".ttf " 파일을 직접 읽어들여 사용합니다. 이 경우는 게임을 배포한다면 폰트의 라이센스에 주의 해야 합니다. 

파일을 실행파일과 같은 디렉토리에 복사해 넣고(여기선 폰트파일이 hangul.ttf 라 가정)

font = pygame.font.Font('hangul.ttf',30) 

와 같은 방법으로 읽어 들이면 됩니다. 뒤의 숫자는 폰트의 크기 입니다.

두 경우 모두 주의해야 할 점은 만일 한글을 표시하고자 한다면 한글폰트가 포함된 폰트를 사용해야 한다는 것입니다. 그렇지 않으면 한글은 모두 'ㅁㅁㅁㅁ' 형태로 표시가 될 것 입니다. 

위의 예 에서 사용한 notosanscjkkr 이라는 폰트 이름은 리눅스에서 한글이 포함된 폰트이며 우분투라면 기본으로 사용 가능한 폰트 입니다.

>

2번 텍스트가 표시된 surface 는 font 객체의 render 함수로 만듭니다.

text_start = font.render("게임을 시작하려면 's' 키를 누르세요.",True,(0,255,0))

표시할 텍스트 문구를 넣고 antialiase 사용여부(글자를 부드럽게 표시), 마지막으로 글자색(RGB) 을 넣어주면 됩니다. 그러면 위의 예에선 text_start 라는 surface 가 생성됩니다. 

>

3번....화면에 표시하기 위해서 위에서 만들어진 surface 를 메인 Surface(우리가 모니터에 표시하는 Surface) 에 표시합니다. 뒤의 숫자는 화면상에 표시할 좌표 입니다. 

background.blit(text_start,(150,300))

이 문장은 게임의 루프인 while 문 안에 넣습니다. 

 >

전체 소스는 다음과 같습니다.

import pygame  
 
SCREEN_X = 800    #게임창 x 크기
SCREEN_Y = 600    #게임창 y 크기
 
screen = pygame.display.set_mode((SCREEN_X,SCREEN_Y)) #게임 윈도우 생성
background = pygame.Surface(screen.get_size())        #게임 화면을 그릴 surface
 
pygame.init() #pygame 초기화
font = pygame.font.SysFont("notosanscjkkr",30)  #폰트 객체 생성
text_start = font.render("게임을 시작하려면 's' 키를 누르세요.",True,(0,255,0))  #텍스트 Surface 만듬
 
done=True  
 
while done:        #이 루프를 벗어나면 게임이 종료됨
    ev = pygame.event.get()  
    for event in ev:  
        if event.type ==pygame.QUIT:     #창의 종료버튼이 눌렸을때 게임종료
            done = False      
        break  
 
    #적과 아군 캐릭터 표현. 점수 표현은 이곳에서
    background.blit(text_start,(150,300))      #메인 Surface에 글자 표시
 
    screen.blit(background,(0,0)) #background 의 화면을 스크린에 복사
    pygame.display.flip()         #화면에 표시함
 

폰트를 사용하기 위해선 초기화가 필요하지만 pygame.init() 를 사용하면 폰트뿐 아니라 사운드등 모든 pygame 관련 초기화가 실행 되기 때문에 따로 폰트의 초기화 명령인 pygame.font.init() 를 사용할 필요가 없습니다. 

 >

실행화면은 다음과 같습니다.


 

댓글