Wednesday, January 23, 2013

AndEngine : Scene and Layer, Event handling

서론


이 문서는 내가 만들고 있는 앱의 제작기나 마찬가지 일듯 하다. 내 블로그의 AndEngine관련 포스팅은 사실 모두 그렇다. 워낙 내 머리를 못믿기 때문에 나중에 내가 다시 보기 위해서 적어가기도 한다. 사실과 다른 내용도 있을 수도 있고(과감히 제게 알려달라) 내가 제시하는 방법이 최선이 아닐 수도 있슴을 미리 밝힌다.

이번 포스팅에서는 앱을 작성하면서, AndEngine을 사용하기로 결정하면서, 씬의 구성을 생각하면서 겪은 나의 '시행착오'와 그것을 해결하는 과정을 기술코자 한다.



AndEngine으로 앱을 개발하면서, 가장 난감했던 부분은 (다른 사람들도 마찬가지겠지만) 문서화가 '거의' 안되어 있다는 것이다. 개발 도중 궁금한 점이나 막힐 때 찾아볼 수 있는 건 AndEngine forum이나  stackoverflow.com의 질답 들, 거기에 몇 개의 (많은 부분 중복이 되는 내용들의) 튜토리얼 블로그들이다. 가장 좋은 하나가 더 있군. 엔진 개발자가 제공하는 샘플 프로젝트. 아마도... 가장 좋은 튜토리얼은 AndEngine의 샘플 프로젝트인데, 역시 이것도 조금은 아쉽다. 특히 '이것이 왜 이렇게 되지?'라는 의문을 갖게 될 때 가장 난감하다. 클래스 소스를 뒤지거나, 디버거를 눈이 빠져다 지켜보는 자신을 쉽게 발견할 수 있을 것이라 믿어 의심치 않는다.ㅋ

조금더 인터랙티브한 앱을 만들기 위해 AndEngine은 나쁘지 않은 선택이었슴이 분명하지만, 개인이 이끄는 라이브러리를 사용한다는 건 시간이 촉박한 개발자들에겐 '제 시간에 앱을 출시'하는 데 가장 큰 리스크가 되지 않을까 싶다.
나 또한 정보를 제공하고 수집하는 앱임에도 사용자에게 조금 나은 인터랙티브를 제공하고자 과감히 변경해버렸지만 만드는 도중(그리고 지금도) 숱하게 후회한 거 같다.

'시작했으니 끝을 봐야지만.. 이거.. 언제 끝낼 수 있을까? 맘먹은 기간 내에 끝낼 수 있을까?' 
여전히 지금도 불안해 하긴 한다.  주제를 이끌기 전에 사설이 너무 길었다. 그럼 시작!



1.Scene과 Layer, 화면을 어떻게 구성하고 관리할 것인가


난 내 앱의 화면을 어떻게 구성할 것인가? 당연히 앱 개발 초기부터 고민을 한다.
AndEngine을 처음 사용하고 있는 사용자라면 아주 막막할 것이다. 샘프로 프로젝트는 아주 간단한 샘플로만 만들어져있어. 복잡한 화면 구성은 어떤 식으로 하면 좋은지에 대한 힌트를 찾기 힘들다.

그러다 찾은 블로그.
http://stuartmct.co.uk/2012/07/16/andengine-scenes-and-scene-management/

블로그에 가서 보면 알겠지만, 별도의 SceneManager 를 두고, Scene이 변경은 물론이고, 각 씬의 리소스를 준비하는 것도 이 클래스가 책임지도록 한다. 오호~

그러다가 다시 하나 더 찾게 된 튜토리얼.
http://developer.samsung.com/s-pen-sdk/samples/Hen-Shooter-using-S-Pen-SDK-AndEngine

여기서는, 우리나라 S사의 갠역시 노트에서 사용하는 S펜(난 안드로이드 레퍼런스 폰들- 넥서스원, 갤럭시 넥서스-만 테스트용으로 가지고 있어서 잘은 모른다)이라는 걸 사용하는 어플을 작성한 과정을 기술해 놓은 것인데.. 여기서에 기술된 게임도 위 구조를 따른다. (뭐가 먼저이니지는 모르나 날짜로만 보면 블로그가 먼저이고  개발문서는 나중? 혹시 같은 사람인가? 확인은 못해봤네...)

거기에 덧붙여,  복잡한 게임 화면을 '한 씬 내에 여러 레이어를 두'는 방법으로 처리하고 있다.
요약해서 보자면,  Entity 클래스를 확장하는 목적별 레이어(점수등 기본 정보를 표시하는 레이어, 게임 아이템등이 반복적으로 나타나는 레이어, 샷건을 관리하는 레이어 등등으로)를 만들어서  가장 주가 되는 레이어가 그것들을 child로 갖고, 다시 그 주가 되는 레이어를 씬에 부착하는 방식이다.

GameScene --as child--> GameLayer --as child--> (HenLayer, GunLayer, HudLayer ... )
(나중에 그림으로 설명을...)

물론, 각각의 레이어는 일정 방식의 공통된 행동을 가져야하기 때문에(업데이트랄지 이런..) 그것들을 선언해놓은 ILayer라는 별도의 인터페이스를 구현하도록 하고도 있다. 그래야 씬에서 레이어 관리가 가능할 것 아닌가?


이 두 문서를 보고, 나도 나으~~ 앱에 적용키로 했다.


(계속)
















No comments:

Post a Comment