본문 바로가기

프로그래밍/libGDX

[libGDX] libGDX에서 freetype-font 사용하기

FreeType

FreeType은 트루타입, 오픈타입, Type1 등의 다양한 폰트 파일로 부터 글리프의 정보를 추출하는 라이브러리 입니다. 보통 게임에서 Bitmap Font를 미리 만들어 두고 런 타임에 Bitmap Font를 로드해서 사용하는데, FreeType을 사용하면 런 타임에 바로 ttf, otf 파일로 부터 폰트를 추출하여 글자를 그릴 수 있습니다. FreeType은 오프소스 프로젝트여서 소스가 공개되어 있고, BSD 라이선스로 배포되기 때문에 사용 프로그램에도 사용 될 수 있습니다.


LibGDX 에서의 FreeType

LibGDX에는 FreeType 라이브러리가 있고, 이를 쉽게 사용할 수 있는 API를 제공하고 있습니다. 이를 이용하여 쉽게 폰트 파일로 부터 글자를 그릴 수 있습니다. FreeType 모듈은 LibGDX의 코어 라이브러리에 있지 않고 extension 형태로 존재합니다. 그래서 FreeType을 사용하기 위해서는 일단 확장 모듈을 라이브러리에 추가하면 됩니다. FreeType jar 파일이 있는 위치는 다음과 같습니다.



gdx-freetype.jar 파일과 gdx-freetype-natives 파일 2개를 복사하여 프로젝트의 libs 폴더 안에 추가합니다. 그리고 buildpath에 추가해줍니다.



이제 FreeType을 사용할 모든 준비가 되었습니다. FreeType을 사용하는 예제의 전체 코드는 다음과 같습니다. 저는 여기서 "깡통로봇.ttf" 폰트를 사용하였습니다.

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;

public class LibgdxTest implements ApplicationListener {
	private OrthographicCamera camera;
	private SpriteBatch batch;
	
	private BitmapFont font;
	
	@Override
	public void create() {		
		camera = new OrthographicCamera(480, 320);
		batch = new SpriteBatch();
		
		FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("data/깡통로봇.ttf"));
		font = generator.generateFont(25, "에돌이의얕고넓은샘", false);
		font.setColor(Color.BLACK);
		generator.dispose();
	}

	@Override
	public void render() {		
		Gdx.gl.glClearColor(1, 1, 1, 1);
		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
		
		batch.setProjectionMatrix(camera.combined);
		batch.begin();
		font.draw(batch, "에돌이의 얕고  넓은 샘", 0, 0);
		batch.end();
	}

	@Override
	public void resize(int width, int height) {}
	@Override
	public void pause() {}
	@Override
	public void resume() {}
	@Override
	public void dispose() {}
}


FreeType을 사용하기 위해서는 먼저 FreeTypeFontGenerator를 생성해야 합니다. FreeTypeFontGenerator는 생성인자로 FileHandle을 받습니다. Gdx.files.internal API를 이용하여 파일을 지정해 줍시다.

FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("data/깡통로봇.ttf"));


다음으로는 폰트를 생성해야 합니다. 이 과정으로 런타임에서 Bitmap Font를 생성하게 됩니다. generator.generateFont 를 사용하면 폰트를 생성할 수 있습니다. generator.generateFont 는 글자 크기를 첫번째 인자로 받고, 두번째 인자로는 생성할 글자들, 세번째 인자로는 뒤집힌 폰트를 얻을지를 boolean 값으로 받게 됩니다. 글자 크기만 지정해 주면 Default로 지정되어 있는 글자들을 생성합니다. 하지만 Default로 지정된 글자들은 영문폰트밖에  없으므로 한글을 사용하고 싶으면 한글 글자를 직접 넣어 주어야 합니다. 저는 "에돌이의 얇고 넓은 샘"을 쓰려고 하므로, 생성될 글자들로는 "에돌이의얕고넓은샘"을 지정해 주도록 하겠습니다.

font = generator.generateFont(25, "에돌이의얕고넓은샘", false);
font.setColor(Color.BLACK);
generator.dispose();


이렇게 하면 폰트의 생성이 완료되었습니다. 마지막으로는 폰트를 그려줍니다.

font.draw(batch, "에돌이의 얕고  넓은 샘", 0, 0);


이렇게 하면 아래와 같이 폰트가 그려지는 것을 확인할 수 있습니다.


LibGDX에서 편리한 FreeType API를 제공하고 있어서 어렵지 않게 폰트 파일로 부터 직접 글자를 그려 넣을 수 있었습니다. 일반적으로 폰트 파일을 직접 쓸 일은 별로 없습니다. 하지만 다양한 글꼴 크기가 필요하다면 FreeType을 이용하여 폰트 파일로 부터 여러개의 Bitmap Font를 생성하는게 좋은 방법입니다.