티스토리 툴바


프로그래밍2010/01/02 23:12
HGE 공식 튜토리얼을 따라가시다보면 3번 튜토리얼에서 아래와 같이 파티클 효과와 함께 화면에 글씨를 찍는 예제가 나옵니다.


잠깐! 컴파일 도중에 'LIBC.lib'를 링크할 수 없다는 오류가 발생한다면 프로젝트 속성창에서 구성 속성->링커->입력의 '특정 라이브러리 무시'에 LIBC.lib를 추가해주시면 됩니다.

키보드의 화살표 키를 누르시면서 공이 튀기는걸 보고 있노라면, 문득 저기 텍스트에 한글은 출력이 안되나 싶은 생각이 드실겁니다. 공하고 무슨 상관이냐고 태클걸면 지는겁니다!! RenderFunc에서 텍스트를 출력하는 부분을 찾아 다음과 같이 한글로 바꿔보겠습니다.
bool RenderFunc(){
	...
	fnt->printf(5, 5, HGETEXT_LEFT, "dt:%.3f\nFPS:%d (상수)", hge->Timer_GetDelta(), hge->Timer_GetFPS());
	...
}

그리고 컴파일! 어떤가요? 아마 한글이 나와야 할 곳에 ??? 만 출력되고 있을겁니다.

이는 HGE가 텍스트를 출력하는 방식이, 로드한 font1.fnt 파일에서 한 글자와 글자에 해당하는 그림을 font1.png 파일에서 잘라와 출력하는 방식이기 때문입니다. 따라서 fnt 파일과 이미지 파일에 한글이 정의되어있지 않으면 그 문자를 출력할 수 없다는 말이죠. 그렇다면 한글에 해당하는 이미지를 만들면 되지않느냐? 하실 수 있겠는데요, 그래서 제가 또 실제로 해봤습니다. 마침 그걸 또 도와주는 프로그램도 있었구요.

결과는..... 만개가 넘는 문자에 대해 100여개의 이미지 파일이 생성되었습니다 OTL 파일 용량도 장난아닐 뿐만 아니라, 만약 여기다 일본어나 한자가 추가된다면.... 그것은 실로 재앙이 아닐 수 없겠습니다;;
또 다른 문제로 글씨의 크기를 변화시키는 경우가 있습니다. 이미 생성된 글자 이미지를 늘리거나 줄이는 방법으로 텍스트의 크기를 조절하게 되는데, 이로인해 글자가 깨져보이거나 지저분해 보이는 문제가 있는 것이죠. 사용 문자의 수가 적은 알파벳만을 대상으로 한다면 크기별로 폰트 이미지를 만들면 되겠지만, 앞에서와 같이 100여개의 이미지 파일을 여러 벌 만들 생각을 하면... 정작 게임 리소스보다 텍스트 리소스가 더 많은 크기를 차지할지도 모르는 일입니다.

잠깐! 위에 언급된 폰트를 눈으로 확인하고 싶으신 분께서는 HGE 포럼에서 다음 링크의 글을 참조해 주세요.

HGE 1.8 Unicode Edition (+font)(http://relishgames.com/forum/viewtopic.php?t=3071)

러시아의 개발자인 elmortem라는 분이 HGE의 유니코드 에디션을 만들었다는 글입니다. 함수 인자로 char형만 사용하는 오리지날 HGE와는 달리 유니코드 에디션에는 wchar_t 형을 사용하도록 하여 유니코드에도 대응이 되고, 폰트 로드 부분을 개선하여 fnt 파일의 크기를 줄일 수 있도록 수정이 되어있습니다. 폰트 파일과 이미지 생성법까지 설명되어 있습니다.

벗뜨!! 결국은 폰트 이미지를 사용하기 때문에 앞에서 언급된 단점이 사라지는 것은 아니며, 원인은 찾지 못했지만 나중에 설명할 라이브러리들과 충돌이 일어나는 관계로 저는 오리지널 HGE 위주로 설명을 진행하겠습니다.

그렇다면 이걸 해결할 수 있는 방법은 어떤것이 있을까요? 바로 폰트파일에서 곧장 원하는 폰트를 원하는 크기로 뽑아내는 것이지요! 그리고 다행히도! 정말 다행히도!! 이 일을 먼저 이루어주신 분이 계십니다.
HGE 포럼의 hgeTTF v2.0 [NEW](http://relishgames.com/forum/viewtopic.php?t=3860) 라는 글을 보시면, FreeType 라이브러리를 이용해서 TTF 폰트의 글자를 HGE상에 찍어낼 수 있도록 해주는 라이브러리의 개발 소식이 올라와 있습니다. 첫페이지의 링크는 깨져 있으므로 맨 마지막 페이지의 링크에서 다운받으실 수 있습니다.

그럼 이제부터 이 글의 본론인(...) hgeTTF 라이브러리를 이용한 HGE에서의 폰트 출력에 대한 설명을 시작해 보도록 하겠습니다.

1. hgeTTF 설치
위에서 소개된 게시글의 링크에서 hgeTTF 라이브러리를 다운받아 적당한 위치에 압축을 해제합니다. 저는 오리지널 HGE와 같은 위치에 해제하였습니다. 이 경우 파일들의 위치는 D:\HGE\hgeTTF2\ 가 되겠군요.


2. 사전 설정
HGE와 같이 hgeTTF 라이브러리를 사용하기 위해서는 비주얼베이직과 프로젝트의 설정이 필요합니다.

1) 비주얼스튜디오 설정
요령은 HGE와 같습니다. 역시 빨간 네모 부분만 추가해 주시면 되겠습니다.



2) 프로젝트 설정
적당한 이름의 프로젝트를 생성하신 후(여기서는 HGEUnicode) HGE와 같은 방법으로 설정합니다. 여기서는 디버그 모드에 대해서만 설정하겠습니다.


3. 동작 테스트
이제 화면에 폰트를 뿌려보겠습니다. hgeTTF 라이브러리의 Test 폴더에 있는 예제를 참고해서, 튜토리얼 3번의 소스를 다음과 같이 고쳐봅시다. 그 전에 '한글을 지원하는' 적당한 ttf 폰트 파일을 구해 프로젝트가 참조할 수 있도록 해둡시다. 여기서는 네이버에서 무료로 제공하는 나눔명조 폰트(http://hangeul.naver.com/share.nhn)를 사용하였습니다.

1) include 파일 추가
#include <hgeTTF/FontManager.h>
#include <hgeTTF/Font.h>

2) 전역 변수 추가
HGE *hge=0;
hgeTTF::FontManager HFontMgr; //추가
hgeTTF::Font* HFont = NULL; //추가

3) 폰트 초기화
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
 	...
	if(hge->System_Initiate()) {
		//폰트 초기화
		HFontMgr.Initialize();
		HFontMgr.loadFont("nanum.ttf"); //네이버에서 제공하는 나눔 명조!
		HFont = HFontMgr.getFont("nanum.ttf");
		HFont->setSize(32);
	...
}

4) 폰트 출력
유니코드 문자를 인식시키기 위해 문자열 앞에 'L'을 붙이는 것을 잊지 맙시다!
bool RenderFunc()
{
	fnt->printf(5, 5, HGETEXT_LEFT, "dt:%.3f\nFPS:%d (상수)", hge->Timer_GetDelta(), hge->Timer_GetFPS());
	HFont->printf(5, 90, L"프레임: %d", hge->Timer_GetFPS()); //추가
}

대망의 컴파일!! 아래 그림과 같이 한글이 출력된다면 성공입니다! 위쪽의 ???로 한글이 나오지 않는 것과 대조적입니다.

참고하실 분들을 위해 이 포스팅에 사용된 프로젝트를 첨부합니다.

이것으로 HGE에서 한글 출력 예제를 완성하였습니다. 파일명이나 윈도우 제목의 경우, 안 그런 곳도 많은 것 같지만;; 저희집 컴이 윈7이어서 그런지 별다른 처리 없이 그냥 함수 인자로 "한글.png" 와 같이 적어도 정상적으로 동작하기 때문에 이와 관련된 내용은 올리지 않았습니다.

다음 포스팅은 UI와 관련된 내용이 될 것 같습니다. 무리해서 장문의 글을 하루에 두번이나 올리니 힘들군요 ㅋㅋㅋ
Posted by 에그