Sunday, December 30, 2012

AndEngine에서 게임 내에 메뉴를 추가하는 방법



AndEngine은 별도의 메뉴 시스템을 제공함. 게임안에 메뉴를 집어넣도록 해주지.
텍스트 메뉴든 그래픽 메뉴든 가능함.

메뉴는 특별한 형태의 또다른 Scene이라고 보면됨. 텍스트든 그래픽이든 순서를 가지고 정렬할 수 있고, 그 중 하나로 부터 터치 이벤트까지 받게되니 참으로 특별하다고 봄. 메뉴가 나타날때 애니메이션까지도 가능하고. 그럼 시작해보자.



메뉴도 또 다른 형태의 Scene이라고?



org.andengine.entity.scene.menu.MenuScene

Scene의 하위 클래스(실제로는 Scene-CameraScene-MenuScene의 형태), 
생성자로는 아래의 네 개가 있다
  • MenuScene()
  • MenuScene(final Camera camera)
  • MenuScene(final IOnMenuItemClickListener pOnMenuItemClickListener)
  • MenuScene(final Camera pCamera, final IOnMenuItemClickListener pOnMenuItemClickListener)


파라메터들을 보면
  • pCamera : scene을 디스플레이하는데 사용되는 카메라, 보통은 (SimpeBaseGameActivity에서는)    onCreateEngineOptions() 메소드에서 선언되거나 초기화 되는 카메라인데, 그게 아니어도 상관은 없다.
  • pOnMenuItemClickListener : 사용자가 메뉴 아이템을  클릭(터치)했을 때를 위한 리스너


이 클래스의 인스턴스 변수로는 메뉴 아이템을 위한 ArrayList, 메뉴 scene이 디스플레이 될 때 사용되는 애니메이터 등등이 있다. AndEngine가 API에 대한 문서는 제공되지 않지만 그래도 인스턴스 변수나 메소드, 파라메터에 대한 네이밍은 그나마 코드를 읽는 데 도움을 준다.(문서에 비교하면 안되지만)
  • protected final ArrayList<IMenuItem> mMenuItems = new ArrayList<IMenuItem>();
  • private IOnMenuItemClickListener mOnMenuItemClickListener;
  • private IMenuAnimator mMenuAnimator = IMenuAnimator.DEFAULT;
  • private IMenuItem mSelectedMenuItem;


메뉴씬(MenuScene)에 메뉴 아이템이나 또다른 씬(scene)을 부착할 수 있도록 몇 개의 메소드도 가지고 있고, 메뉴가 나타날때의 애니메이션도 지정할 수 있는 메소드도 있지.

  • addMenuItem(final IMenutem pMenuItem)
  • getMenuItemCount()
  • setChildScene(final Scene pChildScene, final boolean pModalDraw, final boolean pModalUpdate, final boolean pModalTouch)
  • getChildScene()
  • clearChildScene()
  • setMenuAnimator(final IMenuAnimator pMenuAnimator)




MenuScene에 MenuItem을 더하자!


그럼 메뉴 아이템의 타입엔 어떤 것들이?
  • org.andengine.entity.scene.menu.TextMenuItem
  • org.andengine.entity.scene.menu.SpriteMenuItem
  • org.andengine.entity.scene.menu.AnimatedSpriteMenuItem


이 세개의 클래스는 같은 패키지(org.andengine.entity.scene.menu) 안에 있는 IMenuItem 인터페이스를 구현하고 있다.

TextMenuItem의 가장 기본적인 생성자의 형태를 보면, 메뉴 아이템의 구별을 위한 pID, 폰트 정보 pFont, 메뉴 아이템을 표시할 문자열(GLES2에서는 CharSequence타입, GLES1에서는 String 타입이었슴), 그리고 VertexBufferObjectManager 객체를 인자로 받는다. 

Vertex Buffer는 텍스쳐의 좌표들이 들어있는 배열이라 생각하면 됨. 이 좌표들이 OpenGL ES 파이프라인에 전달되어지며 어떻게 그려져야하는지를 정의하는 것. VertexBufferObjectManager는 씬(scene)에 그려져야할 모든 텍스쳐의 정보를 가지고 있슴.
public TextMenuItem(final int pID, final IFont pFont, final CharSequence pText, final VertexBufferObjectManager pVertextBufferObjectManager)


SpriteMenuItem도 위와 거의 비슷한데 폰트정보와 문자열 대신에 TextureRegion 정보를 인자로 받는다는게 다르다
public SpriteMenuItem(final int pID, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager)


AnimatedSpriteMenuItem은 SpriteMenuItme과 약간 달라서 TextureRegion 정보 대신에 TiledTextureRegion 정보를 받는다
public AnimatedSpriteMenuItem(final int pID, final ITiledTextureRegion pTiledTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager)



메뉴 아이템을 장식하자


org.andengine.entity.scene.menu.item.decorator 패키지에는 아래의 두 클래스가 있으며, 이것은 같은 패키지 내의 BaseMenuItemDecorator 추상클래스를 확장한 것이다. 소스코드를 보며 각각의 객체 생성에 어떠한 파라메터 정보가 필요한지 확인해보자.

ColorMenuItemDecorator
ScaleMenuItemDecorator





아까, 메뉴가 나타날 때 애니메이션도 추가할 수 있다면서?


org.andengine.entity.scene.menu.animator 패키지에는 세 가지의 메뉴 애니메이터 클래스가 구현되어 있고, 이들의 상위 클래스로 BaseMenuAnimator가 추상 클래스 형태로, 이 추상클래스는 IMenuAnimator 인터페이스를 구현하고 있다.

AlphaMenuAnimator
DirectMenuAnimator
SlideMenuAnimator

이름에서 알 수 있듯이 서서히 모습을 드러내게 하거나, 바로 나타나게 하거나, 슬라이드가 나오듯 드러나게 하는 애니메이션 효과를 더할 수 있게 해준다.  이 클래스들도,  소스코드를 보며 각각의 객체 생성에 어떠한 파라메터 정보가 필요한지 확인해보자. 실제 사용예는 이어지는 샘플 클래스 구현 부분에서 볼것이다.




No comments:

Post a Comment