안드 엔진: 리소스 불러오기

안드 엔진에서는 그래픽, 사운드, 음악, 폰트 등의 리소스를 불러오기 위해 팩토리 클래스 사용하는데, 각각의 리소스를 담당하는 BitmapTextureAtlasTextureRegionFactory, SoundFactory, MusicFactory, FontFactory 클래스가 있다.

안드 엔진에서 리소스 파일들은 assets 폴더 아래에 리소스 별로 각각의 폴더에 나누어서 저장해 둔다. 예를 들어, 이미지 파일은 assets/gfx 폴더 안에, 사운드 파일은 assets/sfx 폴더 안에 등과 같은 방식이다. 각 팩토리 클래스마다 setAssetBasePath() 메서드를 통해서 기본 경로를 지정할 수 있다.
BitmapTextureAtlasTextureRegionFactory. setAssetBasePath( "gfx/" );
SoundFactory. setAssetBasePath( "sfx/" );
MusicFactory. setAssetBasePath( "music/" );
FontFactory. setAssetBasePath( "font/" );


그래픽
그래픽 이미지를 불러다 쓰는 과정은 뭔가 좀 복잡하다. 우선, BitmapTextureAtlas 클래스는 비트맵 이미지를 담아두는 그릇이다. atlas의 사전적 의미는 지도이므로, 이미지를 붙여다 놓을 맵 또는 캔버스 정도로 이해하면 좋을 듯 싶다.
TextureRegion은 아틀라스의 일부 영역이며 실제 비트맵 데이터는 TextureRegion 객체로 불러온다. 
그렇다면, 왜 이미지 파일을 직접 불러 오지 않고 BitmapTextureAtlas라는 클래스를 거치도록 만들었을까? 구글에서 검색한 결과들을 종합해본 결과 그 이유는 메모리를 효율적으로 사용하기 위해서이다. BitmapTextureAtlas는 GPU 상의 메모리 블럭이고 이 메모리 블럭에 비트맵 데이터를 불러다 놓고 필요할 때마다 가져다 쓰는 것이다.
아틀라스의 load() 메서드를 사용해서 이미지 파일을 읽고, 더이상 필요없는 이미지는 unload()메서드를 사용해서 메모리에서 해제할 수 있다.
아래 소스 코드는, 48x48 크기의 아틀라스를 만들어 두고, assets/gfx/logo.png라는 이미지 파일을 이 아틀라스의 (0, 0) 위치에 불러다 놓는다는 의미이다.
BitmapTextureAtlas bitmapTextureAtlas = new BitmapTextureAtlas(getTextureManager() , 48, 48);
TextureRegion textureRegion =
        BitmapTextureAtlasTextureRegionFactory. createFromAsset(bitmapTextureAtlas
, this, "logo.png" , 0, 0);
bitmapTextureAtlas.load() ;
  • 아틀라스의 크기를 필요 이상으로 크게 만들지 말 것!
  • 아틀라스의 최대 크기가 1024 픽셀을 넘지 않도록 할 것!
BitmapTextureAtlas 이외에도 BuildableBitmapTextureAtlas라는 클래스가 있는데 이를 사용하면 TextureRegion의 위치를 일일이 지정하지 않아도 자동으로 배치된다는 장점이 있다. 대신 또 다른 차이점은 load() 메서드 실행 전에 build() 메서드를 실행해야 한다는 것이다.

사운드
게임에서 사운드 효과 및 배경 음악을 사용하려면, 다음과 같이 게임 옵션에서 사용 가능하도록 설정해 주어야 한다.
// 게임엔진에서 음악 및 사운드 효과를 사용하도록 설정한다 .
engineOptions.getAudioOptions().setNeedsMusic( true);
engineOptions.getAudioOptions().setNeedsSound( true);

사운드 파일은 다음과 같은 방식으로 Sound 객체로 불러온다. Sound 객체는 안드로이드의 SoundPool 클래스를 통해 재생되도록 구성되어 있다. 
try {
    Sound sound = SoundFactory.createSoundFromAsset(getSoundManager()
, this, "snd.ogg" );
} catch (IOException e) {
    e.printStackTrace()
;
}

사운드 객체는 play() 메서드를 사용해서 재생시킬 수 있다.

음악
음악 파일도 사운드 파일과 유사한 방식으로 불러올 수 있는데, Music 객체는 안드로이드의 MediaPlayer 클래스를 통해서 재생되도록 구성되어 있다.
try {
    Music music = MusicFactory.createMusicFromAsset(getMusicManager()
, this, "bgm.ogg" );
} catch (IOException e) {
    e.printStackTrace()
;
}

불러온 음악을 배경음악으로 재생하기 위해서는 다음과 같이 게임 액티비티의 메서드를 오버라이드해서 처리한다.
@Override
public synchronized void onResumeGame() {
    
if (music != null && !music .isPlaying()){
         
music .play();
    
}
    
super .onResumeGame() ;
}

@Override
public synchronized void onPauseGame() {
    
if (music != null && music .isPlaying()){
         
music .pause();
    
}
    
super .onPauseGame() ;
}

폰트
폰트 파일은 다음과 같이 불러올 수 있다. 매개변수는 순서대로 FontManager, TextureManager, 텍스쳐 가로크기, 텍스쳐 세로 크기, AssetManager, 파일명, 폰트 크기, 안티앨리어스, 폰트 색상이다.
Font font = FontFactory.createFromAsset(getFontManager() ,
         
getTextureManager() , 256, 256,
         
getAssets() , "Arial.ttf", 32f , true,
        
org.andengine.util.adt.color.Color. WHITE_ABGR_PACKED_INT );
font.load() ;

또는 다음과 같은 방식으로 시스템의 기본 폰트를 불러올 수도 있다.
Font font = FontFactory. create(getFontManager() , getTextureManager() , 256, 256,
         
Typeface. create(Typeface. DEFAULT , Typeface. NORMAL ), 32f , true,
        
org.andengine.util.adt.color.Color. WHITE_ABGR_PACKED_INT );





Evernote는 모든 것을 기억하고 간편하게 정리하는데 도움이 됩니다. Evernote를 다운로드하세요.

이 블로그의 인기 게시물

좌표 변환: 회전 이동

Unmappable character for encoding MS949

HTTP POST