cocos2d study #12

장면 (Scene)


장면(Scene)은 말 그대로 화면 내에서 어떠한 장면을 보여준다. 굳이 예를 들자면 게임 오버 장면, 앱을 실행할 때 가장 먼저 뜨는 인트로 장면을 들 수 있다. 그러나 꼭 이런 상황에서만 쓸 수 있는 것은 아니고, 적절한 순간에 Scene을 이용하여 현재 사용자가 보고 있는 화면을 바꿀 수 있다.

Scene 전환

replaceScene

CCDirector 객체로 여러 Scene을 관리하고 장면 전환을 하게 된다.

일반적으로 장면 전환은 replaceScene을 이용한다.

Scene이 전환되면, 현재의 Scene은 메모리에서 해제되고 당연하지만 dealloc이 호출된다.

화면을 터치하면 Scene이 전환되는 예제
// TestScene.m
 
// 다음 Scene 클래스
// 헤더 파일에서 CCLayer를 상속받도록 해준다.
// Scene도 수정할 일이 거의 없으므로
// cocos2d 프로젝트로부터 기본으로 만들어지는 Scene에서
// +(id) scene, -(id)init를 복사하여 사용하면 된다.
 
#import "TestScene.h"
#import "HelloWorldScene.h"
 
@implementation TestScene
 
+(id) scene
{
    CCScene *scene = [CCScene node];
    TestScene *layer = [TestScene node];
    [scene addChild: layer];
    return scene;
}
 
-(id) init
{
    if ( (self = [super init]) )
    {
        // 터치 이벤트 처리 활성화
        self.isTouchEnabled = YES;
 
        CCSprite *background = [CCSprite spriteWithFile:@"scene1.png"];
        background.position = ccp(240,160);
        [self addChild:background];
    }
    return self;
}
 
// 터치가 발생했을 때 처리
-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 소스 코드 선두에 새로운 Scene의 헤더 파일을 #import 해야 한다.
    // 여기서는 HelloWorldScene.h가 된다.
    [ [CCDirector sharedDirector] replaceScene:[HelloWorld scene] ];    
}
 
-(void) dealloc
{
    // Scene이 전환되면 메모리에서 해제된다.
    [super dealloc];
}
 
@end

스택을 이용한 장면 전환

장면을 전환할 때 스택을 이용하려면 replaceScene 대신 pushScene으로 바꿔준다.

Scene을 받아주는 클래스에서는 장면을 다시 되돌릴 때 popScene을 이용하면 된다. 이 때는 replaceScene과 달리 스택에서 꺼내기만 하면 되므로 popScene에 인수는 불필요하다.

// 현재 Scene.m에서는 pushScene으로 장면 전환
[[CCDirector sharedDirector] pushScene:[TestScene scene] ];

// 다음 Scene.m에서는 popScene
[[CCDirector sharedDirector] popScene];

장면 전환 효과 (CCTransition)

장면을 전환할 때 여러 가지 효과를 줄 수 있다.

CCTransitionScene 클래스를 상속받은 여러 개의 클래스를 이용하여 화면 뒤집힘, 슬라이드, 천천히 어두워짐 등의 여러 효과를 주게 된다.

각 효과에 해당하는 클래스 목록은 입력할 때 ESC 키를 눌러 확인할 수 있다.

장면 전환 효과 예제

-(id) init
{
    if ( (self=[super init]) )
    {
        // 터치 이벤트를 받기 위해!
        self.isTouchEnabled = YES;
 
        CCSprite *background = [CCSprite spriteWithFile:@"scene1.png"];
        background.position = ccp(240,160);
        [self addChild:background];
    }
    return self;
}
 
-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // 페이지 전환 효과 CCTransitionPageTurn
    // transitionWithDuration:3을 주었으므로 3초 동안 장면이 전환된다.
    CCScene *scene = [CCTransitionPageTurn transitionWithDuration:3 scene:[TestScene scene]];
    [ [CCDirector sharedDirector] replaceScene:scene ];    
}

장면이 전환될 때 어떤 일이 생기는가?

clip_image002

장면이 전환될 때 현재 Scene에서는 onExit, dealloc이 호출되고, 다음 Scene에서는 init, onEnter, onEnterTransitionDidFinish 순서대로 호출된다.

이런 사실을 이용해서 장면이 완전히 전환되기 전에 어떠한 처리를 해 줄 수 있다.

즉, onEnter, onExit, onEnterTransitionDidFinish와 같은 메소드를 오버라이드하면 되는데, 이 때는 super를 반드시 호출해야 한다.

앞의 예제에서는 CCTransitionPageTurn의 duration을 3초 주었는데, 이 시간 동안 NSLog를 출력해 보고 싶다면 현재 Scene에서 onExit를 오버라이드하여 메소드를 만들면 된다.

만약 다음 Scene이 전환되기 직전에 어떤 처리를 하고 싶다면, 다음 Scene의 onEnter 메소드를 만들면 된다.

'개발 > Cocos2d' 카테고리의 다른 글

cocos2d study #14  (0) 2012.10.26
cocos2d study #13  (0) 2012.10.26
cocos2d study #11  (0) 2012.10.26
cocos2d study #10  (0) 2012.10.26
cocos2d study #09  (0) 2012.10.26

+ Recent posts