adsense



AndEngine 게임 개발 탐구생활 3.

3. scene 관리 기능의 기본

andenginesample2.zip 예제 프로젝트 파일

앞의 내용에서, onCreateScene()에서 scene을 생성하는 것을 보셨습니다.
거기서는 곧바로 Scene 객체를 만들어서 사용하고 있는데, 그래서는 단일 scene밖에 작업하지 못합니다.

안드엔진에서는 게임 전체 스레드를 관리하는 Engine 클래스에서 setScene을 통해 현재 처리중인 scene을 전환하는 기능을 제공하고 있습니다. 이것을 이용해 여러 scene을 관리하는 기능을 구현하려고 합니다.


새 프로젝트를 만들고 안드엔진을 포함시킵니다.
메인 액티비티에는 앞에서 만든 SimpleBaseGameActivity를 상속한 내용을 그대로 복붙합니다.

새로운 Scene 클래스를 만든 후에 protected Scene onCreateScene()의 내용을 수정할 것입니다.

Scene 클래스를 상속한 별도의 화면 클래스 Scene1을 만들어보겠습니다.
아래 그림을 참조해서 새 클래스를 만듭니다. (Superclass는 지금 지정하지 않고, 클래스 생성 후 직접 extends Scene 입력하고 shift+ctrl+o로 가져와도 됩니다)


여기서 터치가 발생하면 Scene2로 전환,
다시 Scene2에서 터치하면 Scene1로 전환하는 것으로 scene 관리 샘플을 만드는 것이 목적입니다.

그러므로 Scene1과 마찬가지로 Scene2 클래스를 만듭니다.


각 Scene에서 해 줄 일은,
- scene의 구분을 위해 초기 백그라운드 컬러를 다르게 설정하는 것,
- 그리고 터치를 받으면 처리 함수를 불러 서로 scene 교체를 해 주는 것입니다.



① 터치를 받아들이기 위해 Scene 외에 IOnSceneTouchListener 인터페이스를 implements 합니다.

② scene이 터치 이벤트를 처리하기 위해서는 해당 scene에 setOnSceneTouchListener를 오버라이드하여 리스너를 활동시켜줘야 합니다.

③ Scene1, Scene2의 생성자에서 setOnSceneTouchListener(this);를 해 주면 터치 이벤트가 발생하면 onSceneTouchEvent가 불립니다. (그림에 벌써 다음 scene을 불러내기 위한 내용이 있습니다만, 요 부분은 좀 아래에서..)

참고로, IOnSceneTouchListener를 implements하지 않고

setOnSceneTouchListener(new IOnSceneTouchListener() {

@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
// TODO Auto-generated method stub
return false;
}
});

이런 식으로 구현해주는 방법도 있습니다.



화면의 전환을 확인할 수 있게 Scene1과 Scene2는 각각 다른 색의 백그라운드를 지정해 줍니다.

자 그럼 이제 Scene1과 Scene2의 onSceneTouchEvent에서 화면을 붙여주는 역할인 setScene을 통해 다른 Scene을 엔진에 붙여주면 되는데..

앞에서 setScene은 Engine 클래스에 있다고 했으니, Engine 객체를 통해 호출해야 합니다. 따라서 BaseGameActivity에서 생성한 Engine 객체가 필요합니다.

이 Engine 객체가 BaseGameActivity에 mEngine이라는 이름으로 선언되어 있고, BaseGameActivity의 OnCreate에서 만들어지므로 Scene1, Scene2의 생성자를 통해 mEngine을 전달해 주면 됩니다.

public Engine engine;

public Scene1(Engine eng){
this.engine = eng;

this.setBackground(new Background(0.8f, 0.5f, 0.7f));
setOnSceneTouchListener(this);
}


자, 그리고 두 번째 그림의 ③에 나와있는 것 처럼, 터치 액션이 들어오면 engine.setScene을 통해서 다른 scene을 호출하도록 코딩해주면 됩니다.

각 화면은 준비가 완료됐습니다. 그럼 주 액티비티로 돌아가서 onCreateScene()이 첫 화면으로 Scene1을 수행할 수 있게 아래와 같이 수정합니다.

@Override
protected Scene onCreateScene() {
// TODO Auto-generated method stub
Scene1 scene = new Scene1(mEngine);//여기입니다

return scene;
}


그럼 실행해 보겠습니다.

터치 할 때마다 핑크색<->청록색 화면이 번갈아 나타나게 됩니다.

scene 전환 시 특수효과(Transition)가 지원되는 coco2d-x에 비하면 좀 심심합니다.


보셨다시피, 안드엔진에서 게임 화면을 Scene단위로 분할하면 Scene을 상속한 클래스 간에 공통된 내용이 있습니다.

앞에서 awt나 안드로이드 surfaceview로 만든 것과 마찬가지로, 이 역시 사용자 클래스-CustomScene으로 만들어 새로운 Scene을 추가할 때마다 상속하게 해 주면 좋겠죠.

따라서 다음 챕터는 Scene 관리 커스터마이즈,
그리고 지금까지 '게임을 만들자는데 왜 핑크색 화면만 봐야 하는가?' 갈증을 풀기 위해 AndEngine의 스프라이트 생성에 대해 다루도록 하겠습니다.



덧글

댓글 입력 영역


Books

Geek라이프

메가 드라이브 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

미소녀 일러스트 테크닉
B-은하, pen스케, 카와이 저/정유진 역

핵심강좌! Cocos2d-x
이재환 저

피규어의 교과서 레진 키트 & 도색 입문 편
후지타 시게토시 저/김정규 역
예스24 | 애드온2
일본서적 전문사이트 NEPIC