您的位置:首页 > 移动开发 > Cocos引擎

几种方法创建cocos2d游戏菜单

2012-10-20 22:02 337 查看
从学习cocos2d的官方例子入手.官方的MenuTest例子,提供了4个层来展示各种菜单效果和用户交互的实现.

1.----------------------

#import "AppDelegate.m"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(UIApplication*)application

{

// 以上省略了大量初始化代码

CCScene *scene = [CCScene node];

// 这里是关键要学习的部分.

// 既往我理解,放在同一个Scene里的多个Layer,同时按不同的z-order显示

// 存在先后显示顺序的Layer,应该放入不同的Scene里显示.

// 而这个问题,在发现CCMultiplexLayer的使用后,才得以真正理解.

// 利用switchTo方法,可以改变激活显示的Layer,在Scene里改变显示的Layer

CCMultiplexLayer *layer = [CCMultiplexLayer layerWithLayers: [Layer1
node], [Layer2 node], [Layer3 node], [Layer4
node], nil];

[scene addChild: layer z:0];

[window makeKeyAndVisible];

[[CCDirector sharedDirector] runWithScene: scene];

}

//以下省略了大量代码

@end

2.-----------------------

#import "Layer1"

@implementation Layer1

-(id) init

{

if( (self=[super init])) {

//设置默认的菜单项字体属性

[CCMenuItemFont setFontSize:30];

[CCMenuItemFont setFontName: @"Courier New"];

//1*********创建第一个菜单项方法

//这个菜单项完全使用精灵完成.

//与其说是菜单项,不如说是个按钮,它像按钮一样,提供普通状态,点中状态和禁用状态三种不同状 态下需要显示的Sprite

//并且,与UIButton类似的,点击事件通过对target的回调方法来实现.

CCSprite *spriteNormal = [CCSprite spriteWithFile:@"menuitemsprite.png" rect:CGRectMake(0,23*2,115,23)];

CCSprite *spriteSelected = [CCSprite spriteWithFile:@"menuitemsprite.png" rect:CGRectMake(0,23*1,115,23)];

CCSprite *spriteDisabled = [CCSprite spriteWithFile:@"menuitemsprite.png" rect:CGRectMake(0,23*0,115,23)];

CCMenuItemSprite *item1 = [CCMenuItemSprite itemFromNormalSprite:spriteNormal selectedSprite:spriteSelected
disabledSprite:spriteDisabled target:self selector:@selector(menuCallback:)];

//2********创建第二个菜单项方法

//这个菜单项与第一个类似,不同之处是直接使用图片完称,比精灵更简洁.

CCMenuItem *item2 = [CCMenuItemImage itemFromNormalImage:@"SendScoreButton.png"selectedImage:@"SendScoreButtonPressed.png" target:self
selector:@selector(menuCallback2:)];

//3*********创建第三个菜单项方法

//这个菜单项使用的是文本Label方式

//值得一提的是,cocos2d提供了超级方便的自定义字库调用方法.

//如下方法中,设置好字库文件,并且以ascii字符排序顺序定义好字库的初始字符,就可以使用 字库创建文本Label.

//以label方式创建的菜单项,会自动以点击放大作为菜单的操作效果来处理.

//如果要求护理特别特殊的点中效果,也可以继承CCMenuItem之后复写selected方 法来实现

CCLabelAtlas *labelAtlas = [CCLabelAtlas labelAtlasWithString:@"0123456789" charMapFile:@"fps_images.png" itemWidth:16itemHeight:24 startCharMap:'.'];

CCMenuItemLabel *item3 = [CCMenuItemLabel itemWithLabel:labelAtlas target:self
selector:@selector(menuCallbackDisabled:)];

item3.disabledColor = ccc3(32,32,64);

item3.color = ccc3(200,200,255);

//4*********** 创建第四个菜单项方法
   //这是一个纯文本的菜单项.

CCMenuItem *item4 = [CCMenuItemFont itemFromString: @"I
toggle enable items" target: self selector:@selector(menuCallbackEnable:)];

// 5***********创建第五个菜单项方法.

// 这也是一个使用文本配合字库文件创建的菜单项.

// 不同的是,这里使用了fnt格式的字库描述文件.关于fnt格式的字库描述文件,我们今后再做详细研究.

CCBitmapFontAtlas *label = [CCBitmapFontAtlas bitmapFontAtlasWithString:@"configuration" fntFile:@"bitmapFontTest3.fnt"];

CCMenuItemLabel *item5 = [CCMenuItemLabel itemWithLabel:label target:self
selector:@selector(menuCallbackConfig:)];

// 6*************创建第六个菜单项方法

// 这是一个最普通的文本菜单项,但是它搭配了一个动画效果.文本颜色,会一直变化

CCMenuItemFont *item6 = [CCMenuItemFont itemFromString: @"Quit" target:self
selector:@selector(onQuit:)];

id color_action = [CCTintBy actionWithDuration:0.5f red:0 green:-255 blue:-255];

id color_back = [color_action reverse];

id seq = [CCSequence actions:color_action, color_back, nil];

[item6 runAction:[CCRepeatForever actionWithAction:seq]];

//组合菜单******** 使用上述所有菜单项,构造菜单.

CCMenu *menu = [CCMenu menuWithItems: item1, item2, item3, item4, item5, item6, nil];

// 将菜单居中对齐

[menu alignItemsVertically];

// *****************给菜单制作一个展现效果.

// 以下的算法,实现了菜单项交叉从左右飞入的效果,还是很酷滴.

// 关于cocos2d各种动画效果的使用,我觉得有必要单独开一篇学习笔记来学习,今天就先略过吧.

CGSize s = [[CCDirector sharedDirector] winSize];

int i=0;

for( CCNode *child in [menu children] ) {

CGPoint dstPoint = child.position;

int offset = s.width/2 + 50;

if( i % 2 == 0)

offset = -offset;

child.position = ccp( dstPoint.x + offset, dstPoint.y);

[child runAction:

[CCEaseElasticOut actionWithAction:

[CCMoveBy actionWithDuration:2 position:ccp(dstPoint.x - offset,0)]

period: 0.35f]

];

i++;

}

//将第三个菜单项设为禁用,用于演示toggle菜单项的功能

disabledItem = [item3 retain];

disabledItem.isEnabled = NO;

[self addChild: menu];

}

return self;

}

-(void) menuCallback: (id) sender

{

//点击菜单项时,将激活Layer切换为另外一个,相当于进入2级菜单

[(CCMultiplexLayer*)parent_ switchTo:1];

}

-(void) menuCallbackEnable:(id) sender {

//点击菜单项时,将某个菜单项禁用

disabledItem.isEnabled = ~disabledItem.isEnabled;

}

-(void) onQuit: (id) sender

{

//点击退出按钮的处理

//在SDK 3.0以上,苹果不允许应用程序自己执行退出.所以,应用程序其实不应该有自己的Quit菜单项.

// http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html
[[CCDirector sharedDirector] end];

if( [[UIApplication sharedApplication] respondsToSelector:@selector(terminate)] )

[[UIApplication sharedApplication] performSelector:@selector(terminate)];

else

NSLog(@"YOU CAN'T TERMINATE YOUR APPLICATION PROGRAMATICALLY in SDK 3.0+");

}

//省略了其他代码.

@end

#import "Layer4.h"

//*****第四个层演示了比较经典的设置界面.主要通过CCMenuItemToggle来实现

@implementation Layer4

-(id) init

{

[super init];

//创建一组开关菜单项,简单地说,就是on/of

//这组菜单项由两部分组成

//title是显示用的文字,不可以接受用户点击

[CCMenuItemFont setFontName: @"American Typewriter"];

[CCMenuItemFont setFontSize:18];

CCMenuItemFont *title1 = [CCMenuItemFont itemFromString: @"Sound"];

[title1 setIsEnabled:NO];

//接下来的是可以接受用户点击的菜单项

//这个菜单项提供了两个item,在call时,可以根据选中的index切换显示

[CCMenuItemFont setFontName: @"Marker Felt"];

[CCMenuItemFont setFontSize:34];

CCMenuItemToggle *item1 = [CCMenuItemToggle itemWithTarget:self selector:@selector(menuCallback:) items:

[CCMenuItemFont itemFromString: @"On"],

[CCMenuItemFont itemFromString: @"Off"],

nil];

//与上一个菜单项项相同,省略了两组共四个菜单项的代码

//这个菜单项与上面的基本相同

[CCMenuItemFont setFontName: @"American Typewriter"];

[CCMenuItemFont setFontSize:18];

CCMenuItemFont *title4 = [CCMenuItemFont itemFromString: @"Orientation"];

[title4 setIsEnabled:NO];

[CCMenuItemFont setFontName: @"Marker Felt"];

[CCMenuItemFont setFontSize:34];

CCMenuItemToggle *item4 = [CCMenuItemToggle itemWithTarget:self selector:@selector(menuCallback:) items:

[CCMenuItemFont itemFromString: @"Off"], nil];

//不同的是,这个菜单项使用了subItems的addObjectsFromArray方法来设置更多 的可选项.

NSArray *more_items = [NSArray arrayWithObjects:

[CCMenuItemFont itemFromString: @"33%"],

[CCMenuItemFont itemFromString: @"66%"],

[CCMenuItemFont itemFromString: @"100%"],

nil];

[item4.subItems addObjectsFromArray: more_items];

item4.selectedIndex = 2;//设置一个初选中的项目

// 设置第五组菜单项

[CCMenuItemFont setFontName: @"Marker Felt"];

[CCMenuItemFont setFontSize:34];

CCBitmapFontAtlas *label = [CCBitmapFontAtlas bitmapFontAtlasWithString:@"go
back" fntFile:@"bitmapFontTest3.fnt"];

CCMenuItemLabel *back = [CCMenuItemLabel itemWithLabel:label target:self
selector:@selector(backCallback:)];

//构建菜单

CCMenu *menu = [CCMenu menuWithItems:

title1, title2,

item1, item2,

title3, title4,

item3, item4,

back, nil]; //共五组九个菜单项.

//对齐菜单项

//这是一个比较独特的对齐方法,即让菜单项目以分列方式居中对齐.

//第一组两列,会让前两个菜单项,将屏幕分为两列,在每列内居中.

//最后设置为了列,使一个菜单项单独占据一行

[menu alignItemsInColumns:

[NSNumber numberWithUnsignedInt:2],

[NSNumber numberWithUnsignedInt:2],

[NSNumber numberWithUnsignedInt:2],

[NSNumber numberWithUnsignedInt:2],

[NSNumber numberWithUnsignedInt:1],

nil

]; // 2 + 2 + 2 + 2 + 1 = 共9个.

[self addChild: menu];

return self;

}

-(void) menuCallback: (id) sender

{

//选中菜单项的回调,切换显示选中项目

NSLog(@"selected item: %@ index:%d", [sender selectedItem], [sender
selectedIndex] );

}

//省略部分代码

@end

下面附上cocos2d官方MenuTest文件

#import "cocos2d.h"

@class CCMenu;

#import "BaseAppController.h"

@interface AppController : BaseAppController

@end

@interface LayerMainMenu : CCLayer

{

CCMenuItem *disabledItem;

}

@end

@interface Layer2 : CCLayer

{

CGPoint centeredMenu;

BOOL alignedH;

}

-(void) menuCallbackBack: (id) sender;

-(void) menuCallbackOpacity: (id) sender;

-(void) menuCallbackAlign: (id) sender;

@end

@interface Layer3 : CCLayer

{

CCMenuItem *disabledItem;

}

-(void) menuCallback: (id) sender;

-(void) menuCallback2: (id) sender;

@end

@interface Layer4 : CCLayer

{

}

-(void) menuCallback: (id) sender;

-(void) backCallback: (id) sender;

@end

@interface LayerPriorityTest : CCLayer

{

}

@end

//

// Menu Demo

// a cocos2d example

// http://www.cocos2d-iphone.org
//

#import "MenuTest.h"

enum {

kTagMenu = 1,

kTagMenu0 = 0,

kTagMenu1 = 1,

};

#pragma mark - MainMenu

@implementation LayerMainMenu

-(id) init

{

if( (self=[super init])) {

#ifdef __CC_PLATFORM_IOS

self.isTouchEnabled = YES;

#endif

// Font Item

CCSprite *spriteNormal = [CCSprite spriteWithFile:@"menuitemsprite.png" rect:CGRectMake(0,23*2,115,23)];

CCSprite *spriteSelected = [CCSprite spriteWithFile:@"menuitemsprite.png" rect:CGRectMake(0,23*1,115,23)];

CCSprite *spriteDisabled = [CCSprite spriteWithFile:@"menuitemsprite.png" rect:CGRectMake(0,23*0,115,23)];

CCMenuItemSprite *item1 = [CCMenuItemSprite itemWithNormalSprite:spriteNormal selectedSprite:spriteSelected disabledSprite:spriteDisabled block:^(id sender) {

CCScene *scene = [CCScene node];

[scene addChild:[Layer2 node]];

[[CCDirector sharedDirector] replaceScene:scene];

}];

// Image Item

CCMenuItem *item2 = [CCMenuItemImage itemWithNormalImage:@"SendScoreButton.png" selectedImage:@"SendScoreButtonPressed.png" block:^(id sender) {

CCScene *scene = [CCScene node];

[scene addChild:[Layer3 node]];

[[CCDirector sharedDirector] replaceScene:scene];

}];

// Label Item (LabelAtlas)

CCLabelAtlas *labelAtlas = [CCLabelAtlas labelWithString:@"0123456789" charMapFile:@"fps_images.png" itemWidth:12 itemHeight:32 startCharMap:'.'];

CCMenuItemLabel *item3 = [CCMenuItemLabel itemWithLabel:labelAtlas block:^(id sender) {

// hijack all touch events for 5 seconds

CCDirector *director = [CCDirector sharedDirector];

#ifdef __CC_PLATFORM_IOS

[[director touchDispatcher] setPriority:kCCMenuHandlerPriority-1 forDelegate:self];

[self schedule:@selector(allowTouches) interval:5.0f repeat:0 delay:0];

#elif defined(__CC_PLATFORM_MAC)

[[director eventDispatcher] addMouseDelegate:self priority:kCCMenuHandlerPriority-1];

[self schedule:@selector(allowTouches) interval:5.0f];

#endif

NSLog(@"TOUCHES DISABLED FOR 5 SECONDS");

}];

item3.disabledColor = ccc3(32,32,64);

item3.color = ccc3(200,200,255);

// Font Item

CCMenuItemFont *item4 = [CCMenuItemFont itemWithString: @"I toggle enable items" block:^(id sender) {

// IMPORTANT: It is safe to use "self" because CCMenuItem#cleanup will break any possible circular reference.

self->disabledItem.isEnabled = ~self->disabledItem.isEnabled;

}];

[item4 setFontSize:20];

[item4 setFontName:@"Marker Felt"];

// Label Item (CCLabelBMFont)

CCLabelBMFont *label = [CCLabelBMFont labelWithString:@"configuration" fntFile:@"bitmapFontTest3.fnt"];

CCMenuItemLabel *item5 = [CCMenuItemLabel itemWithLabel:label block:^(id sender) {

CCScene *scene = [CCScene node];

[scene addChild:[Layer4 node]];

[[CCDirector sharedDirector] replaceScene:scene];

}];

// Testing issue #500

item5.scale = 0.8f;

// Events

[CCMenuItemFont setFontName: @"Marker Felt"];

CCMenuItemFont *item6 = [CCMenuItemFont itemWithString:@"Priority Test" block:^(id sender) {

CCScene *scene = [CCScene node];

[scene addChild:[LayerPriorityTest node]];

[[CCDirector sharedDirector] pushScene:scene];

}];

// Font Item

[CCMenuItemFont setFontSize:30];

[CCMenuItemFont setFontName: @"Courier New"];

CCMenuItemFont *item7 = [CCMenuItemFont itemWithString: @"Quit" block:^(id sender){

CC_DIRECTOR_END();

}];

id color_action = [CCTintBy actionWithDuration:0.5f red:0 green:-255 blue:-255];

id color_back = [color_action reverse];

id seq = [CCSequence actions:color_action, color_back, nil];

[item7 runAction:[CCRepeatForever actionWithAction:seq]];

CCMenu *menu = [CCMenu menuWithItems: item1, item2, item3, item4, item5, item6, item7, nil];

[menu alignItemsVertically];

// elastic effect

CGSize s = [[CCDirector sharedDirector] winSize];

int i=0;

for( CCNode *child in [menu children] ) {

CGPoint dstPoint = child.position;

int offset = s.width/2 + 50;

if( i % 2 == 0)

offset = -offset;

child.position = ccp( dstPoint.x + offset, dstPoint.y);

[child runAction:

[CCEaseElasticOut actionWithAction:

[CCMoveBy actionWithDuration:2 position:ccp(dstPoint.x - offset,0)]

period: 0.35f]

];

i++;

}

disabledItem = [item3 retain];

disabledItem.isEnabled = NO;

[self addChild: menu];

[menu setPosition:ccp(s.width/2, s.height/2)];

}

return self;

}

#ifdef __CC_PLATFORM_IOS

-(void) registerWithTouchDispatcher

{

CCDirector *director = [CCDirector sharedDirector];

[[director touchDispatcher] addTargetedDelegate:self priority:kCCMenuHandlerPriority+1 swallowsTouches:YES];

}

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event

{

return YES;

}

-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event

{

}

-(void) ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event

{

}

-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event

{

}

#elif defined(__CC_PLATFORM_MAC)

-(BOOL) ccMouseDown:(NSEvent *)event

{

return YES;

}

-(BOOL) ccMouseUp:(NSEvent *)event

{

return YES;

}

-(BOOL) ccMouseMoved:(NSEvent *)event

{

return YES;

}

-(BOOL) ccMouseDragged:(NSEvent *)event

{

return YES;

}

#endif // __CC_PLATFORM_MAC

-(void) dealloc

{

[disabledItem release];

[super dealloc];

}

-(void) allowTouches

{

CCDirector *director = [CCDirector sharedDirector];

#ifdef __CC_PLATFORM_IOS

[[director touchDispatcher] setPriority:kCCMenuHandlerPriority+1 forDelegate:self];

[self unscheduleAllSelectors];

#elif defined(__CC_PLATFORM_MAC)

[[director eventDispatcher] removeMouseDelegate:self];

#endif

NSLog(@"TOUCHES ALLOWED AGAIN");

}

@end

#pragma mark - StartMenu

@implementation Layer2

-(void) alignMenusH

{

for(int i=0;i<2;i++) {

CCMenu *menu = (CCMenu*)[self getChildByTag:100+i];

menu.position = centeredMenu;

if(i==0) {

// TIP: if no padding, padding = 5

[menu alignItemsHorizontally];

CGPoint p = menu.position;

menu.position = ccpAdd(p, ccp(0,30));

} else {

// TIP: but padding is configurable

[menu alignItemsHorizontallyWithPadding:40];

CGPoint p = menu.position;

menu.position = ccpSub(p, ccp(0,30));

}

}

}

-(void) alignMenusV

{

for(int i=0;i<2;i++) {

CCMenu *menu = (CCMenu*)[self getChildByTag:100+i];

menu.position = centeredMenu;

if(i==0) {

// TIP: if no padding, padding = 5

[menu alignItemsVertically];

CGPoint p = menu.position;

menu.position = ccpAdd(p, ccp(100,0));

} else {

// TIP: but padding is configurable

[menu alignItemsVerticallyWithPadding:40];

CGPoint p = menu.position;

menu.position = ccpSub(p, ccp(100,0));

}

}

}

-(id) init

{

if( (self=[super init]) ) {

}

return self;

}

// Testing issue #1018 and #1021

-(void) onEnter

{

[super onEnter];

// remove previously added children

[self removeAllChildrenWithCleanup:YES];

for( int i=0;i < 2;i++ ) {

CCMenuItemImage *item1 = [CCMenuItemImage itemWithNormalImage:@"btn-play-normal.png" selectedImage:@"btn-play-selected.png" target:self selector:@selector(menuCallbackBack:)];

CCMenuItemImage *item2 = [CCMenuItemImage itemWithNormalImage:@"btn-highscores-normal.png" selectedImage:@"btn-highscores-selected.png" target:self selector:@selector(menuCallbackOpacity:)];

CCMenuItemImage *item3 = [CCMenuItemImage itemWithNormalImage:@"btn-about-normal.png" selectedImage:@"btn-about-selected.png" target:self selector:@selector(menuCallbackAlign:)];

item1.scaleX = 1.5f;

item2.scaleY = 0.5f;

item3.scaleX = 0.5f;

CCMenu *menu = [CCMenu menuWithItems:item1, item2, item3, nil];

CGSize s = [[CCDirector sharedDirector] winSize];

[menu setPosition:ccp(s.width/2, s.height/2)];

menu.tag = kTagMenu;

[self addChild:menu z:0 tag:100+i];

centeredMenu = menu.position;

}

alignedH = YES;

[self alignMenusH];

}

-(void) dealloc

{

[super dealloc];

}

-(void) menuCallbackBack: (id) sender

{

CCScene *scene = [CCScene node];

[scene addChild:[LayerMainMenu node]];

[[CCDirector sharedDirector] replaceScene:scene];

}

-(void) menuCallbackOpacity: (id) sender

{

CCMenu *menu = (CCMenu*) [sender parent];

GLubyte opacity = [menu opacity];

if( opacity == 128 )

[menu setOpacity: 255];

else

[menu setOpacity: 128];

}

-(void) menuCallbackAlign: (id) sender

{

alignedH = ! alignedH;

if( alignedH )

[self alignMenusH];

else

[self alignMenusV];

}

@end

#pragma mark - SendScores

@implementation Layer3

-(id) init

{

if( (self=[super init]) ) {

[CCMenuItemFont setFontName: @"Marker Felt"];

[CCMenuItemFont setFontSize:28];

CCLabelBMFont *label = [CCLabelBMFont labelWithString:@"Enable AtlasItem" fntFile:@"bitmapFontTest3.fnt"];

CCMenuItemLabel *item1 = [CCMenuItemLabel itemWithLabel:label target:self selector:@selector(menuCallback2:)];

CCMenuItemFont *item2 = [CCMenuItemFont itemWithString: @"--- Go Back ---" target:self selector:@selector(menuCallback:)];

CCSprite *spriteNormal = [CCSprite spriteWithFile:@"menuitemsprite.png" rect:CGRectMake(0,23*2,115,23)];

CCSprite *spriteSelected = [CCSprite spriteWithFile:@"menuitemsprite.png" rect:CGRectMake(0,23*1,115,23)];

CCSprite *spriteDisabled = [CCSprite spriteWithFile:@"menuitemsprite.png" rect:CGRectMake(0,23*0,115,23)];

CCMenuItemSprite *item3 = [CCMenuItemSprite itemWithNormalSprite:spriteNormal selectedSprite:spriteSelected disabledSprite:spriteDisabled target:self selector:@selector(menuCallback3:)];

disabledItem = item3;

disabledItem.isEnabled = NO;

CCMenu *menu = [CCMenu menuWithItems: item1, item2, item3, nil];

CGSize s = [[CCDirector sharedDirector] winSize];

item1.position = ccp(s.width/2 - 150, s.height/2);

item2.position = ccp(s.width/2 - 200, s.height/2);

item3.position = ccp(s.width/2, s.height/2 - 100);

id jump = [CCJumpBy actionWithDuration:3 position:ccp(400,0) height:50 jumps:4];

[item2 runAction: [CCRepeatForever actionWithAction:

[CCSequence actions: jump, [jump reverse], nil]

]

];

id spin1 = [CCRotateBy actionWithDuration:3 angle:360];

id spin2 = [[spin1 copy] autorelease];

id spin3 = [[spin1 copy] autorelease];

[item1 runAction: [CCRepeatForever actionWithAction:spin1]];

[item2 runAction: [CCRepeatForever actionWithAction:spin2]];

[item3 runAction: [CCRepeatForever actionWithAction:spin3]];

[self addChild: menu];

[menu setPosition:ccp(0,0)];

}

return self;

}

- (void) dealloc

{

[super dealloc];

}

-(void) menuCallback: (id) sender

{

CCScene *scene = [CCScene node];

[scene addChild:[LayerMainMenu node]];

[[CCDirector sharedDirector] replaceScene:scene];

}

-(void) menuCallback2: (id) sender

{

NSLog(@"Label clicked. Toogling Sprite");

disabledItem.isEnabled = ~disabledItem.isEnabled;

[disabledItem stopAllActions];

}

-(void) menuCallback3:(id) sender

{

NSLog(@"MenuItemSprite clicked");

}

@end

#pragma mark - Layer4

@implementation Layer4

-(id) init

{

if( (self = [super init] ) ) {

[CCMenuItemFont setFontName: @"American Typewriter"];

[CCMenuItemFont setFontSize:18];

CCMenuItemFont *title1 = [CCMenuItemFont itemWithString: @"Sound"];

[title1 setIsEnabled:NO];

[CCMenuItemFont setFontName: @"Marker Felt"];

[CCMenuItemFont setFontSize:34];

CCMenuItemToggle *item1 = [CCMenuItemToggle itemWithTarget:self selector:@selector(menuCallback:) items:

[CCMenuItemFont itemWithString: @"On"],

[CCMenuItemFont itemWithString: @"Off"],

nil];

[CCMenuItemFont setFontName: @"American Typewriter"];

[CCMenuItemFont setFontSize:18];

CCMenuItemFont *title2 = [CCMenuItemFont itemWithString: @"Music"];

[title2 setIsEnabled:NO];

[CCMenuItemFont setFontName: @"Marker Felt"];

[CCMenuItemFont setFontSize:34];

CCMenuItemToggle *item2 = [CCMenuItemToggle itemWithTarget:self selector:@selector(menuCallback:) items:

[CCMenuItemFont itemWithString: @"On"],

[CCMenuItemFont itemWithString: @"Off"],

nil];

[CCMenuItemFont setFontName: @"American Typewriter"];

[CCMenuItemFont setFontSize:18];

CCMenuItemFont *title3 = [CCMenuItemFont itemWithString: @"Quality"];

[title3 setIsEnabled:NO];

[CCMenuItemFont setFontName: @"Marker Felt"];

[CCMenuItemFont setFontSize:34];

CCMenuItemToggle *item3 = [CCMenuItemToggle itemWithTarget:self selector:@selector(menuCallback:) items:

[CCMenuItemFont itemWithString: @"High"],

[CCMenuItemFont itemWithString: @"Low"],

nil];

[CCMenuItemFont setFontName: @"American Typewriter"];

[CCMenuItemFont setFontSize:18];

CCMenuItemFont *title4 = [CCMenuItemFont itemWithString: @"Orientation"];

[title4 setIsEnabled:NO];

[CCMenuItemFont setFontName: @"Marker Felt"];

[CCMenuItemFont setFontSize:34];

CCMenuItemToggle *item4 = [CCMenuItemToggle itemWithTarget:self selector:@selector(menuCallback:) items:

[CCMenuItemFont itemWithString: @"Off"], nil];

NSArray *more_items = [NSArray arrayWithObjects:

[CCMenuItemFont itemWithString: @"33%"],

[CCMenuItemFont itemWithString: @"66%"],

[CCMenuItemFont itemWithString: @"100%"],

nil];

// TIP: you can manipulate the items like any other NSMutableArray

[item4.subItems addObjectsFromArray: more_items];

// you can change the one of the items by doing this

item4.selectedIndex = 2;

[CCMenuItemFont setFontName: @"Marker Felt"];

[CCMenuItemFont setFontSize:34];

CCLabelBMFont *label = [CCLabelBMFont labelWithString:@"go back" fntFile:@"bitmapFontTest3.fnt"];

CCMenuItemLabel *back = [CCMenuItemLabel itemWithLabel:label target:self selector:@selector(backCallback:)];

CCMenu *menu = [CCMenu menuWithItems:

title1, title2,

item1, item2,

title3, title4,

item3, item4,

back, nil]; // 9 items.

[menu alignItemsInColumns:

[NSNumber numberWithUnsignedInt:2],

[NSNumber numberWithUnsignedInt:2],

[NSNumber numberWithUnsignedInt:2],

[NSNumber numberWithUnsignedInt:2],

[NSNumber numberWithUnsignedInt:1],

nil

]; // 2 + 2 + 2 + 2 + 1 = total count of 9.

[self addChild: menu];

CGSize s = [[CCDirector sharedDirector] winSize];

[menu setPosition:ccp(s.width/2, s.height/2)];

}

return self;

}

- (void) dealloc

{

[super dealloc];

}

-(void) menuCallback: (id) sender

{

NSLog(@"selected item: %@ index:%u", [sender selectedItem], (unsigned int) [sender selectedIndex] );

}

-(void) backCallback: (id) sender

{

CCScene *scene = [CCScene node];

[scene addChild:[LayerMainMenu node]];

[[CCDirector sharedDirector] replaceScene:scene];

}

@end

#pragma mark - LayerPriorityTest

@implementation LayerPriorityTest

-(id) init

{

if( (self = [super init] ) ) {

// Testing empty menu

CCMenu *menu1 = [CCMenu node];

CCMenu *menu2 = [CCMenu node];

// Menu 1

[CCMenuItemFont setFontName:@"Marker Felt"];

[CCMenuItemFont setFontSize:18];

CCMenuItemFont *item1 = [CCMenuItemFont itemWithString:@"Return to Main Menu" block:^(id sender) {

[[CCDirector sharedDirector] popScene];

}];

CCMenuItemFont *item2 = [CCMenuItemFont itemWithString:@"Disable menu for 5 seconds" block:^(id sender) {

[menu1 setEnabled:NO];

CCDelayTime *wait = [CCDelayTime actionWithDuration:5];

CCCallBlockO *enable = [CCCallBlockO actionWithBlock:^(id object) {

[object setEnabled:YES];

}object:menu1];

CCSequence *seq = [CCSequence actions:wait, enable, nil];

[menu1 runAction:seq];

}];

[menu1 addChild:item1];

[menu1 addChild:item2];

[menu1 alignItemsVerticallyWithPadding:2];

[self addChild:menu1];

// Menu 2

static BOOL priority = 1;

[CCMenuItemFont setFontSize:48];

item1 = [CCMenuItemFont itemWithString:@"Toggle priority" block:^(id sender) {

if( priority == 1) {

[menu2 setHandlerPriority:kCCMenuHandlerPriority + 20];

priority = 0;

} else {

[menu2 setHandlerPriority:kCCMenuHandlerPriority - 20];

priority = 1;

}

}];

[item1 setColor:ccc3(0,0,255)];

[menu2 addChild:item1];

[self addChild:menu2];

}

return self;

}

- (void) dealloc

{

[super dealloc];

}

@end

// CLASS IMPLEMENTATIONS

#pragma mark - AppController - iOS

#ifdef __CC_PLATFORM_IOS

@implementation AppController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

[super application:application didFinishLaunchingWithOptions:launchOptions];

// Enables High Res mode (Retina Display) on iPhone 4 and maintains low res on all other devices

if( ! [director_ enableRetinaDisplay:YES] )

CCLOG(@"Retina Display Not supported");

// display FPS (useful when debugging)

[director_ setDisplayStats:YES];

// Default texture format for PNG/BMP/TIFF/JPEG/GIF images

// It can be RGBA8888, RGBA4444, RGB5_A1, RGB565

// You can change anytime.

[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];

// If the 1st suffix is not found, then the fallback suffixes are going to used. If none is found, it will try with the name without suffix.

// On iPad HD : "-ipadhd", "-ipad", "-hd"

// On iPad : "-ipad", "-hd"

// On iPhone HD: "-hd"

CCFileUtils *sharedFileUtils = [CCFileUtils sharedFileUtils];

[sharedFileUtils setEnableFallbackSuffixes:YES]; // Default: NO. No fallback suffixes are going to be used

[sharedFileUtils setiPhoneRetinaDisplaySuffix:@"-hd"]; // Default on iPhone RetinaDisplay is "-hd"

[sharedFileUtils setiPadSuffix:@"-ipad"]; // Default on iPad is "ipad"

[sharedFileUtils setiPadRetinaDisplaySuffix:@"-ipadhd"]; // Default on iPad RetinaDisplay is "-ipadhd"

CCScene *scene = [CCScene node];

[scene addChild: [LayerMainMenu node]];

[director_ pushScene: scene];

return YES;

}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

// supports all 4 orientations

return YES;

}

@end

#pragma mark - AppController - Mac

#elif defined(__CC_PLATFORM_MAC)

@implementation AppController

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

{

[super applicationDidFinishLaunching:aNotification];

CCScene *scene = [[CCScene alloc] init];

id layer = [[LayerMainMenu alloc] init];

[scene addChild:layer];

[layer release];

[director_ runWithScene:scene];

[scene release];

}

@end

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: