주요 클래스를 훌터보며 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],
// 3. RGB Color값 지정 방법 :
// 1. 메뉴항목 폰트 조절 : static 함수로 다음 함수가 호출될때 까지 적용됨
[CCMenuItemFont setFontSize:18];
// 2. 메뉴 항목을 두 줄로 표현 :
[menu alignItemsInColumns: [NSNumber numberWithUnsignedInt:2], [NSNumber numberWithUnsignedInt:2],
[NSNumber numberWithUnsignedInt:2], nil];
/*
alignItemsInColumns : 메뉴 행당 표현될 column 갯수를 지정
alignItemsInRows : 메뉴 열당 표현될 Row 갯수를 지정
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 실행화면
'아이폰개발 > cocos2d' 카테고리의 다른 글
[cocos2D]초기 메뉴 구현하기 (0) | 2010.07.19 |
---|---|
[cocos2D]주요 클래스 검토 : CCScene, CCDirector, CCLayer, CCScene, CCNode (0) | 2010.07.18 |
[cocos2d] Hello World 분석 (1) | 2010.07.18 |
[cocos2d] 준비 및 설치하기 (1) | 2010.07.15 |