제작 로그 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() 를 사용할 필요가 없습니다.
>
실행화면은 다음과 같습니다.
댓글
댓글 쓰기