2012-08-05 24 views
2

我有兩項菜單 - 新遊戲和積分。 它們垂直對齊的,就像這樣:如何在Cocos2d中移動CCMenu?

New Game 
Credits 

當你點擊新的遊戲,我想學分轉移下來,打開兩個新的菜單項,這樣的:

New Game 
    Player vs Player 
    Player vs AI 
Credits 

我該怎麼辦呢?在我的代碼菜單中只是覆蓋自己,所以我有這些項目在彼此之上。

- (id) init 
{ 
    if ([super init]) 
    { 
     CCLayerColor *bg = [CCLayerColor layerWithColor:ccc4(0, 0, 0, 255)]; 
     [self addChild:bg z:-1]; 


     CCMenuItemFont *menu1 = [CCMenuItemFont itemFromString:@"New Game" target:self selector:@selector(callSecondMenu)]; 
     [menu1 setColor:ccc3(255, 255, 255)]; 

     CCMenuItemFont *menu2 = [CCMenuItemFont itemFromString:@"Credits"]; 
     [menu2 setColor:ccc3(255, 255, 255)]; 

     CCMenu *menu = [CCMenu menuWithItems:menu1, menu2, nil]; 
     [menu alignItemsVerticallyWithPadding:10]; 
     [self addChild:menu z:10]; 



    } 
    return self; 
} 

- (void) callSecondMenu 
{ 
    CCMenuItemFont *menu1 = [CCMenuItemFont itemFromString:@"Player vs Player" target:self selector:@selector(callGame)]; 
    CCMenuItemFont *menu2 = [CCMenuItemFont itemFromString:@"Player vs AI" target:self selector:@selector(callGame)]; 
    CCMenu *menu = [CCMenu menuWithItems:menu1, menu2, nil]; 
    [menu alignItemsVerticallyWithPadding:5]; 
    [self addChild:menu]; 
} 

回答

3

想象menuItems只是遊戲中的角色。

我在遊戲中移動菜單的方式是在它自己的獨立CCMenu中創建每個菜單項並將每個CCMenu設置在0,0位置。

然後我使用它們的位置屬性在其開始位置手動定位CCMenuItemSprite/CCMenuItemFont菜單項(不是CCMenu),然後使用CCMoveTo操作在需要時移動菜單項。這當然可以用於任何CCMenuItem子類,例如您正在使用的CCMenuItemFont。

這種方法的不足之處在於,您失去了自動對齊菜單項的能力,並且它們作爲單獨的菜單運行,但這對於以任何方式移動菜單項來說是一個小的代價創造有趣的效果。

您還可以使用任何其他操作,如CCFadeIn,CCSkewTo,CCScaleBy等對各個菜單項執行很酷的效果。

1)當創建擁有menuItems的節點時,我創建了所有菜單項。然後,當需要每個菜單項時,通過移動或淡入到位來爲其設置動畫。

2)我避免使用標籤。這只是我的偏好。我寧願創建兩個NSMutableDictionary作爲實例變量,一個叫做menuButtons,一個叫做menuButtonActions。然後我使用助手函數來創建menuItems和actions並將它們存儲在可變字典中。然後爲buttonNamed:runActionNamed:和buttonNamed:setPosition:等常規事物創建方法。然後這些方法使用兩個可變字典來檢索所需的menuItem和action(需要時),然後應用所需的效果。

這可能看起來像更多的工作,但如果你的遊戲有幾種不同的情況,你需要顯示通用的菜單按鈕,那麼你的代碼可以更具可讀性和可重用性,因爲你所要做的就是創建你的菜單系統在未來使用這樣的代碼:

-(void) showNewGameMenuExpanded:(BOOL)isExpanded { 

    if(isExpanded){ 
     [menuNode buttonNamed:@"credits" runActionNamed:@"creditsSlideDown"]; 
     [menuNode buttonNamed:@"playerVsPlayer" runActionNamed:@"playerVsPlayerShow"]; 
     [menuNode buttonNamed:@"playerVsAi" runActionNamed:@"playerVsAiShow"]; 
    }else{ 
     [menuNode buttonNamed:@"credits" runActionNamed:@"creditsSlideUp"]; 
     [menuNode buttonNamed:@"playerVsPlayer" runActionNamed:@"playerVsPlayerHide"]; 
     [menuNode buttonNamed:@"playerVsAi" runActionNamed:@"playerVsAiHide"]; 
    } 

} 

建設上的菜單節點初始化你的按鈕和行動並將其存儲在字典中使用的這種技術的偉大工程如暫停菜單或菜單的東西,從滑入允許選擇不同武器等的屏幕側面等。


編輯:

下面是一些代碼通過Mazyod添加展示如何通過訪問使用標籤的菜單項移動菜單項。

首先,tag屬性設置爲您CCMenuItem S:

CCMenuItemFont *menu1 = [CCMenuItemFont itemFromString:@"New Game" target:self selector:@selector(callSecondMenu)]; 
    [menu1 setColor:ccc3(255, 255, 255)]; 
    [menu1 setTag:1]; 

    CCMenuItemFont *menu2 = [CCMenuItemFont itemFromString:@"Credits"]; 
    [menu2 setColor:ccc3(255, 255, 255)]; 
    [menu2 setTag:2]; 

    CCMenu *menu = [CCMenu menuWithItems:menu1, menu2, nil]; 
    [menu alignItemsVerticallyWithPadding:10]; 
    // add tag for the menu, or use instance variables: 
    [self addChild:menu z:10 tag:kMenuTag]; 

然後,在你的另一種方法:

CCMenuItem* credits = [[self getChildByTag:kMenuTag] getChildByTag:2]; 
// apply the action ... It has been ages since I touched cocos2d: 
[credits runAction:[CCMoveBy actionWithDuration:0.5f position:ccp(0, 40)]]; 

CCMenuItemFont *menu1 = [CCMenuItemFont itemFromString:@"Player vs Player" target:self selector:@selector(callGame)]; 
CCMenuItemFont *menu2 = [CCMenuItemFont itemFromString:@"Player vs AI" target:self selector:@selector(callGame)]; 
CCMenu *menu = [CCMenu menuWithItems:menu1, menu2, nil]; 
[menu alignItemsVerticallyWithPadding:5]; 
[self addChild:menu]; 
+0

究竟是什麼吉姆說。讓我在那裏添加一些代碼,但我認爲你必須等到適度。 – Mazyod 2012-08-05 16:48:32