주요 클래스를 훌터보며 cocos2D는 여러 Scene으로 구성되어 연결된다는 사실을 알았다.  
  기존 예제는 HellowWorldScene.h파일에 다음과 같이 정의 되어 있다.
//
//  HelloWorldLayer.h
//   MyGame
//
//  Created by Daniel Lee on 10. 7. 17..
//  Copyright SimVerse 2010. All rights reserved.
//


// When you import this file, you import all the cocos2d classes
#import "cocos2d.h"

// HelloWorld Layer
@interface HelloWorld : CCLayer
{
}

// returns a Scene that contains the HelloWorld as the only child
+(id) scene;

@end

 그럼 추가적인 Scene을 만들어 각 메뉴항목을 클릭하면 전환효과를 적용하는 방식으로 예제를 확장해 보자

1. 새로운 CCLayer를 프로젝트에 추가
  1) File -> New File ...  실행 후 User Template 항목에서 "cocos2d 0.99.4"를 선택 
  2) Subclass of "CCLayer"를 선택하고 Next 버튼 추

    3) File Name "TransitMenu" 입력 후 Finish 클 


2. TransitMenu.m 파일 구현

  1) 우리가 구현하고자 하는 Scene 역시 메뉴로 구현되어 있으므로, 기존 HelloWorld 파일과 크게 다르지 않다. 기존 HelloWorldScene.m의 내용을 새로 구현할 TransitMenu.m에 그대로 복사하여 붙여 놓자. 

  2) Transit효과를 줄 수 있는 메뉴 항목을 만들고 각각의 기능을 연결하자. 
    ㄱ. Transition 효과 구현 클래스  
  • CCFadeTransition
  • CCFlipAngularTransition
  • CCShrinkGrowTransition
  • CCMoveInBTransition
  • CCMoveInTTransition
  • CCMoveInLTransition
  • CCMoveInRTransition
  • CCFadeTRTransition
  • CCFadeUpTransition
  • CCFlipXTransition
  • CCFlipYTransition
  • CCPageTurnTransition
  • CCCrossFadeTransition

       ㄴ. 메뉴 화면 구성시 팁 
// TransitMenu 항목이 모두 13개나 되므로, 한 화면에 보이기 위해서는 메뉴항목 폰트를 조절해야함 
//  1. 메뉴항목 폰트 조절 : static 함수로 다음 함수가 호출될때 까지 적용됨
[CCMenuItemFont setFontSize:18];

//  2. 메뉴 항목을 두 줄로 표현 :
[menu alignItemsInColumns: [NSNumber numberWithUnsignedInt:2], [NSNumber numberWithUnsignedInt:2],
[NSNumber numberWithUnsignedInt:2], nil];
/*
alignItemsInColumns : 메뉴 행당 표현될 column 갯수를 지정 
alignItemsInRows : 메뉴 열당 표현될 Row 갯수를 지정
*/

//  3. RGB Color값 지정 방법 : 
/*
   3 color  : 구조체/변환함수 = ccColor3B / ccc3(r,g,b)
   4 color  : 구조체/변환함수 = ccColor4B / ccc4(r,g,b,a)
*/

    ㄷ. 화면전환 구현방법
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];   // 새로 적용될 CCLayer 
[[CCDirector sharedDirector] replaceScene:[CCFlipXTransition transitionWithDuration:1 scene:sMain]];

    ㄹ. TransitMenu.m 구현 내용 (TransitMenu.h 은 Template에서 생성한 내용 그대로 사용)
//  TransitMenu.m
//   MyGame
//
//  Created by Daniel Lee on 10. 7. 23..
//  Copyright 2010 SimVerse. All rights reserved.
//

#import "TransitMenu.h"
#import "HelloWorldScene.h"


@implementation TransitMenu

+(id) scene
{
// 'scene' is an autorelease object.
CCScene *scene = [CCScene node];
// 'layer' is an autorelease object.
TransitMenu *layer = [TransitMenu node];
// add layer as a child to scene
[scene addChild: layer];
// return the scene
return scene;
}

// on "init" you need to initialize your instance
-(id) init
{
// always call "super" init
// Apple recommends to re-assign "self" with the "super" return value
if( (self=[super init] )) {
CCLabel* label = [CCLabel labelWithString:@"<<< Transit Menu >>>" fontName:@"Marker Felt" fontSize:20];
CGSize size = [[CCDirector sharedDirector] winSize];
label.position =  ccp( size.width / 2 , size.height/10 );
[self addChild: label];
[CCMenuItemFont setFontSize:18];
CCMenuItemFont *item1 = [CCMenuItemFont itemFromString:@"Fade" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item2 = [CCMenuItemFont itemFromString:@"FlipAngular" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item3 = [CCMenuItemFont itemFromString:@"ShrinkGrow" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item4 = [CCMenuItemFont itemFromString:@"MoveInB" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item5 = [CCMenuItemFont itemFromString:@"MoveInT" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item6 = [CCMenuItemFont itemFromString:@"MoveInL" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item7 = [CCMenuItemFont itemFromString:@"MoveInR" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item8 = [CCMenuItemFont itemFromString:@"FadeTR" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item9 = [CCMenuItemFont itemFromString:@"FadeUp" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item10= [CCMenuItemFont itemFromString:@"FlipX" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item11= [CCMenuItemFont itemFromString:@"FlipY" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item12= [CCMenuItemFont itemFromString:@"PageTurn" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item13= [CCMenuItemFont itemFromString:@"CrossFade" target:self selector:@selector(displayNext:)];
CCMenuItemFont *item14= [CCMenuItemFont itemFromString:@" " target:self selector:@selector(displayNext:)];
CCMenuItemFont *item15= [CCMenuItemFont itemFromString:@"return Main Menu" target:self selector:@selector(displayNext:)];

CCMenu *menu = [CCMenu menuWithItems:item1, item2, item3, item4, item5, item6, item7, item8, item9, item10,item11, item12, item13, item14,item15, nil];
[menu setPosition:ccp(size.width/2, size.height/2 + 20)];
[menu alignItemsVertically];
[menu alignItemsInColumns: [NSNumber numberWithUnsignedInt:2],
[NSNumber numberWithUnsignedInt:2],
[NSNumber numberWithUnsignedInt:2],
[NSNumber numberWithUnsignedInt:2],
[NSNumber numberWithUnsignedInt:2],
[NSNumber numberWithUnsignedInt:2],
[NSNumber numberWithUnsignedInt:2],
[NSNumber numberWithUnsignedInt:1], nil];
 
//[self addChild:menu z:1 tag:0];
[self addChild:menu];
item1.tag = 0;
item2.tag = 1;
item3.tag = 2;
item4.tag = 3;
item5.tag = 4;
item6.tag = 5;
item7.tag = 6;
item8.tag = 7;
item9.tag = 8;
item10.tag = 9;
item11.tag = 10;
item12.tag = 11;
item13.tag = 12; 
item15.tag = 14;
//*/
}
return self;
}


-(void)displayNext:(id)sender {
switch ([(CCMenuItemFont *)sender tag]) {
case 0: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCFadeTransition transitionWithDuration:1 scene:sMain withColor:ccc3(255,0,0)]];
}
break;
case 1: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCFlipAngularTransition transitionWithDuration:1 scene:sMain]];
}
break;
case 2: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCShrinkGrowTransition transitionWithDuration:1 scene:sMain ]];
}
break;
case 3: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCMoveInBTransition transitionWithDuration:1 scene:sMain ]];
}
break;
case 4: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCMoveInTTransition transitionWithDuration:1 scene:sMain ]];
}
break;
case 5: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCMoveInLTransition transitionWithDuration:1 scene:sMain ]];
}
break;
case 6: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCMoveInRTransition transitionWithDuration:1 scene:sMain ]];
}
break;
case 7: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCFadeTRTransition transitionWithDuration:1 scene:sMain ]];
}
break;
case 8: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCFadeUpTransition transitionWithDuration:1 scene:sMain ]];
}
break;
case 9: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCFlipXTransition transitionWithDuration:1 scene:sMain ]];
}
break;
case 10: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCFlipYTransition transitionWithDuration:1 scene:sMain ]];
}
break;
case 11: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCPageTurnTransition transitionWithDuration:10 scene:sMain ]];
}
break;
case 12: {
CCScene *sMain = [CCScene node];
[sMain addChild:[TransitMenu node]];
[[CCDirector sharedDirector] replaceScene:[CCCrossFadeTransition transitionWithDuration:1 scene:sMain ]];
}
break;
// Main Menu로 돌아가기
case 14: {
CCScene *sMain = [CCScene node];
[sMain addChild:[HelloWorld node]];
[[CCDirector sharedDirector] replaceScene:[CCCrossFadeTransition transitionWithDuration:1 scene:sMain ]];
}
break;
default:
break;
}
}


// on "dealloc" you need to release all your retained objects
- (void) dealloc
{
// in case you have something to dealloc, do it in this method
// in this particular example nothing needs to be released.
// cocos2d will automatically release all the children (Label)
// don't forget to call "super dealloc"
[super dealloc];
}

@end

## HelloWorldScene.m에서도 "TransitMen"라는 메뉴항목을 추가하고 클릭시 해당 Scene으로 연결되도록 한다.

3. 실행화면
  1) 초기실행화면

  2)TransitMenu 화면  


  3) PageTurn 실행화면

Posted by 꿈을펼쳐라
,

cocos2D를 구성하고 있는 주요 클래스와 기본 개념을 살펴보면 다음과 같다.
(원문 : http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:basic_concepts#scenes) 
CCScene  
  - app 구현흐름에 비교적 독립적인 장면 구현 : (scene ==  screens == stages )
  - app는 여러개를 갖을 수 있지만, 특정한 순간에는 단 하나의 scene만을 갖음.
  - 하나이상의 CCLayer로 구성됨. ( 형태 및 행위를 구현해줌)
  - Scene사이의 변환은  CCTransitionScene 클래스로 구현가능 ( ex. fade out/in, slide from a side, etc)
  - CCNode의 SubClass이므로 Actions에 의해 변환될 수 있음.
[scene의 구성]
CCDirector  
  - Scene들의 앞뒤 순서를 관리
  - shared Object( singleton)형태로 구현됨.
  - OpenGL ES의 초기화 담당
  - scene calls를 관리  
CLayer 
  - 그릴 수 잇는 영역의 크기를 갖고 있으며, 그리를 구현 방식을 정의함.
  - 타 Layer와 반투명 형태로 겹치게 표현가능
  - Event Handler를 구현하는 클래스 (Event는 특정 Layer가 해당이벤트를 받아 적용할 때까지 전파됨)
  - cocos2D에서는 유용한 CCLayer를 미리 정의해 두었음 ( 메뉴 담당 : CCMenu, 컬러 : CCColorLayer, 멀티픽셀러 : CCMultiplexLayer, ...  물론 사용자정의의 CCLayer를 구현할 수 있음) 
  - CCNode의 SubClass이므로 Actions에 의해 변환될 수 있음.
CCSprite  
  - 2D 이미지를 담당하고 있으며, 이동, 회전, 크기변환, 에니메이션 효과 등을 적용할 수 있음.
  - 다른 CCSprite Object를 하위로 갖을 수 있으며, 부모가 변환시 자식들도 변환됨
  - CCNode의 SubClass이므로 Actions에 의해 변환될 수 있음.
CCNode
  - Object C에서 NSObject와 마찬가지로 cocos2D의 대부분의 클래스는 CCNode에서 상속받음
  - 다른 Node를 추가/삭제하는 컨테이너 포함  
  - 특정 시점을 기준으로 Callback 함수 호출을 통한 스캐줄 관리  
  - Action을 실행할 수 있음.  
  - Rendering 방식을 정의할 수 있음.

클래스 세부정보 :   http://www.cocos2d-iphone.org/api-ref/0.99.4/annotated.html
Posted by 꿈을펼쳐라
,