幾種方法創建cocos2d遊戲菜單

從學習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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章