我有两个项目的菜单-新游戏和学分。它们垂直对齐,如下所示:
New Game
Credits当你点击新游戏时,我想要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];
}发布于 2012-08-05 23:06:37
把menuItems想象成你游戏中的角色。
我在我的游戏中移动菜单的方式是在它自己的独立CCMenu中创建每个菜单项,并将每个CCMenu设置在0,0位置。
然后,我使用开始位置的position属性手动定位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:
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];https://stackoverflow.com/questions/11815525
复制相似问题