티스토리 뷰

프로그래밍/게임 개발

[LibGDX]TextureAtlas를 써보기

터프 프로그래머 2011. 11. 10. 10:35
다운로드
http://code.google.com/p/libgdx-texturepacker-gui/
LibGDX를 사용하는 유저
(혹은 LibGDX 개발자)가 내장되어 있는 Texture Packer 기능으로 GUI툴을 만든 것 같습니다.
jar 파일을 실행해야합니다. jar 실행파일 여는 법은 검색해보시면 잘 나옵니다.

Texture Atlas는 다음 그림을 보시면 이해하실 듯 합니다.

게임 자료를 찾다보면 이러한 그림들을 보신적이 몇번 있을 것입니다.
이 Texture Atlas를 사용함으로써 리소스 파일 갯수도 줄이고, 용량도 줄일 수 있다고 합니다. (용량에 대해서는 잘 이해가 안가지만)
어찌되었든 연관된 그림들을 한 그림 파일 안에 압축해서 넣음으로써 얻는 이점이 있죠.
Texture Packer로 이미지들을 Packing 하면 단지 이 그림파일만 생성되는 것이 아니라 이미지 파일들의 위치정보와 크기 등도 저장됩니다.
따라서 같이 저장된 데이터 파일과 위의 Texture Atlas 파일이 있으면 Texture Atlas 안에 있는 이미지만을 떼어와서 사용할 수 있게 됩니다.

특히 LibGDX에서는 Texture Atlas를 사용함으로써 얻게 되는 큰 이점이 있습니다. (저만의 생각일지도 모르겠습니다.)
바로 이미지 크기를 반드시 2의 제곱수로 할 필요가 없다는 것입니다!!
제가 가진 이미지들은 50*50, 100*100 등 2의 제곱수인 그림 파일이 거의 없습니다.
하지만 LibGDX에서는 그림파일이 반드시 2의 제곱수여야 하는데, 가진 그림파일을 억지로 리사이징 하면
그림이 꺠지는 것은 물론이고 기획 쪽에서도 수정사항이 생기게 됩니다.
하지만 Texture Atlas를 사용해서 원래 그림의 크기를 유지할 수 있게 되는 것이죠.

잡다한 설명은 여기까지 하고 실제로 사용해보도록 하겠습니다.
제가 사용한 Texture Atlas 그림파일과 데이터 파일을 업로드합니다.

pack


위에 TexturePacker-gui에 기본으로 들어가 있는 그림파일을 사용하였습니다.
하지만 쓰기 편하기 위해 그림파일들은 test1.png, test2.png, test3.png으로 이름을 바꾸었구요. 그림파일 이름은 input1.png 입니다.
그에 따라 나오는 pack 데이터 파일도 좀 수정이 되었겠죠.
이것들을 LibGDX로 게임을 만드는 프로젝트의 resource 폴더로 옮깁니다.
따라서 resource/input1.png 파일이 있겠고, resource/pack 파일이 있겠죠?


다음으로 이제 코딩을 합니다.
 먼저 texture atlas 데이터파일을 로드 합니다.

TextureAtlas atlas = new TextureAtlas(Gdx.files.internal("resource/pack"));


 그리고 이 TextureAtlas를 이용해서 Sprite를 만듭니다. 여기서 spr은 당연히 멤버변수입니다. 한 줄로 끝낼려고 이렇게 표현한겁니다.
LibGDX 찾아보실 정도면 이 정도는 당연히 아시리라 믿고 그냥 쓰겠습니다.

Sprite spr = atlas.createSprite("test1");

 
여기서 눈여겨 볼 점은 createSprite의 인자 값입니다.
위에서 저 TextureAtlas 그림파일은 test1.png, test2.png, test3.png로 만들어졌다고 언급하였습니다.
createSprite를 할 때의 인자값은 그림파일의 이름입니다. 확장자를 제외한. 이 점을 유념하시구요. 

이제 draw를 해볼까요?
프로젝트를 만드셨었으면 render() 메소드가 있으실겁니다.
여기서 그림을 그리는 것은 아실 것이라 생각합니다.

@Override

public void render() {

// TODO Auto-generated method stub

Gdx.gl.glClearColor(1, 0, 0, 1);

Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

batch.begin();

//batch.draw(atlas.findRegion("test1").getTexture(), 0, 0);

//atlas.createSprite("test1").draw(batch);

spr.draw(batch);

spr.setPosition(100, 100);

batch.end();

}

 
주석처리된 부분 중 batch.draw(atlas.findRegion("test1").getTexture(), 0, 0); 
이 부분을 실행이 되게 하면 그냥 Texture atlas의 모든 그림이 출력됩니다. 아니 그냥 그 그림파일 하나가 출력된다고 보는게 맞을 것 같네요.
두번째 부분인 atlas.createSprite("test1").draw(batch);
이 부분을 실행하면 아래의 것과 똑같이 나옵니다. 단지 위치의 차이죠.
왜냐하면 CreateSprite로 Sprite를 만든다는 것이 같기 때문입니다. 하지만 SetPosition을 못했으니 당연히 0,0 기준으로 그려지게 되겠죠.
코드가 워낙 쉽기 때문에 쉽게 이해하실겁니다.


저는 이 부분에 대해서 자료를 못 찾아서 되게 고생했습니다.
다 하고 나니까 별거 없더라고요. 정말 열받게.... TexturePacker라는 상용 툴도 받아서 해봐도 안되고....
근데 LibGDX 구글코드 홈페이지에 조그마하게 자기네 것에서 쉽게 쓸 수 있게 해주는 툴을 소개 해놨더군요. 
처음부터 그걸 봤으면 훨씬 쉽게 할 수 있었을텐데....
다른 분들은 저 처럼 삽질을 하지 않길 바라면서 이 글을 올립니다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday