2

我有两个项目的菜单 - 新游戏和积分。它们垂直对齐,如下所示:

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];
}
4

1 回答 1

3

将 menuItems 视为游戏中的角色。

我在游戏中移动菜单的方式是在它自己的单独 CCMenu 中创建每个菜单项,并将每个 CCMenu 设置在位置 0,0。

然后我使用它们的位置属性在它们的开始位置手动定位 CCMenuItemSprite/CCMenuItemFont 菜单项(不是 CCMenu),然后在需要时使用 CCMoveTo 操作来移动菜单项。这当然适用于任何 CCMenuItem 子类,例如您正在使用的 CCMenuItemFont。

这种方法的缺点是您失去了自动对齐菜单项的能力,并且它们充当单独的菜单,但这对于能够以任何方式移动菜单项以创建有趣的效果的好处来说是很小的代价。

您还可以使用任何其他操作(如 CCFadeIn、CCSkewTo、CCScaleBy 等)对各个菜单项进行炫酷效果。

1)当拥有 menuItems 的节点被创建时,我创建了所有的菜单项。然后,当需要每个菜单项时,我通过将其移动或淡入到位来为其设置动画。

2)我避免使用标签。这只是我的偏好。相反,我更喜欢创建两个 NSMutableDictionary 作为实例变量,一个称为 menuButtons,一个称为 menuButtonActions。然后我使用辅助函数来创建 menuItems 和操作并将它们存储在可变字典中。然后为 buttonNamed:runActionNamed: 和 buttonNamed:setPosition: 等一般事物创建方法。然后,这些方法使用两个可变字典来检索所需的 menuItem 和操作(在需要时),然后应用所需的效果。

这似乎需要更多的工作,但是如果您的游戏有几种不同的情况,您需要显示常用的菜单按钮,那么您的代码可以更具可读性和可重用性,因为您所要做的就是在未来使用创建菜单系统像这样的代码:

-(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];
于 2012-08-05T15:06:37.213 回答