기본 콘텐츠로 건너뛰기

[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() 를 사용할 필요가 없습니다. 

 >

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


 

댓글

이 블로그의 인기 게시물

유로트럭 시뮬레이터 2 순간이동 치트 사용방법

최근 이벤트때 운송해야 할 물건이 나오지 않아 고민중에 어떤 게임사이트에서 찾아낸 방법입니다. 이미 게임을 충분히 하신 분들은 여기저기에 창고가 이미 있을것이기 때문에 그 창고로 이동하면 되지만 그렇지 못한 분들은 지역을 이동하는것이 시간이 많이 걸립니다. 이 방법을 쓰면 특정 도시로 빠르게 이동이 가능합니다. 내문서 -> Euro Truck Simulator 2 의 config.cfg 를 사용하시는 텍스트 에디터로 수정합니다. 수정해야 할 부분은 위에 표시해 놓은 부분입니다. 원래값은 0 이며 1로 바꿔줍니다. 이제 키보드의 '~' 키를 누르면 콘솔창이 뜹니다. 위의 스크린샷이 콘솔을 띄운 화면 입니다. 위와 같이 키보드를 눌렀을때 콘솔이 뜨면 일단 준비과정은 끝납니다. 이제 순간이동 사용법을 알려드리겠습니다. 1. 숫자키 '0'을 눌러서 프리카메라 모드로 들어갑니다. 2. 'm' 키를 눌러서 이동해야 할 도시를 확인하고 도시의 이름을 외워둡니다. 3. 콘솔을 열고 'goto 도시이름' 을 입력합니다. 성공했으면 해당 도시로 바로 이동합니다. 4. 마우스와 키보드 오른쪽의 숫자키패드를 이용해서 지상으로 이동합니다. 5. Ctrl + F9 키를 눌러 트럭을 소환합니다. 위의 순서에서 4번은 주의 하셔야 합니다. 트럭은 Ctrl + F9 를 누르는 순간 카메라의 위치로 소환됩니다. 만일 지상으로 이동하지 않고 트럭을 소환하실 경우 트럭이 지상으로 추락하여 손상 100%가 될 수도 있습니다. 즐거운 게임 되시길 바랍니다.    2022 년 2월 3일 수정사항 트럭의 소환키가 F9 에서 Ctrl + F9 로 변경되었다는 걸 확인해서 본문을 수정했습니다.

antix linux 업데이트시 GPG Error

 최근에 가장 가벼운 리눅스를 검색해서 antix 리눅스를 설치해서 테스트 해 보고 있습니다. 역시 가볍긴 가볍더군요. 생각보단 패키지 구성도 괜찮아 보였고요.    설치후 좀 써보고 업데이트를 하는데 GPG Error 가 발생했습니다. GPG 키 관련 문제인것 같아서 검색해 보니 antixforum에 답이 있었습니다.  https://www.antixforum.com/forums/topic/how-to-fix-expired-gpg-key-error/   간단히 적어보자면... http://repo.antixlinux.com/bookworm/pool/main/a/antix-archive-keyring/antix-archive-keyring_20019.5.0_all.deb 위 파일을 받은 다음에 터미널에서... sudo dpkg -i antix-archive-keyring_20019.5.0_all.deb 을 실행해서 설치해 주면 됩니다.    그런다음 업데이트를 시도해 보면 잘 됩니다.   

최근 우분투 리눅스에서 snap 앱을 모두 삭제했습니다

 사실 조금 된 이야기이긴 한데. 제 우분투 리눅스에서 snap 앱을 모두 삭제 했습니다.  여러 이유로 snap 을 싫어하는 분들이 있기는 한데 제 경우는 그렇게 부정적인 입장은 아닙니다.  개발자들 세계에서도 여러 라이브러리 버전문제로 인해 docker 같은것을 쓰는걸 보면 실행에 필요한 라이브러리를 내장한다는 개념은 편리함으로 다가올수도 있습니다.  그냥 제 경우는 간단히 프로그램들이 차지하는 용량(크기)의 문제였습니다.  저는 오래전에 구입한 64기가 SSD 에 리눅스를 설치해서 계속 쓰고 있습니다. 그리 큰용량은 아니지만 이걸로 리눅스를 사용하는데 용량이 크게 부족하다고 느낀적은 없었는데(대량의 데이터는 NTFS 로 포맷한 데이터 저장용/게임용 SSD 에 저장합니다) snap 앱들을 설치하니 64기가가 부족하더군요.  좀 더 용량이 큰 SSD를 추가 구입해서 리눅스를 다시 설치할까 고민을 했었는데 제가 사용하는 프로그램이나 그런걸 보고 snap 용 프로그램을 정리해 보니 사용에 딱히 지장은 없겠더군요. 그래서 snap 앱을 정리하고 쓰고 있습니다.   snap 앱들의 크기를 너무 간과했습니다. 실제 써보니 꽤 많이 먹네요. 이렇게 해 놓고 보니 그냥 arch 리눅스나 설치해서 쓸까 하는 유혹이 또 들긴합니다만....이젠 다시 설치도 귀찮아서....manjaro 정도로 타협도 고려중입니다. ^^;