我有两个项目的菜单 - 新游戏和积分。
它们垂直对齐,如下所示:
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 selectorselector(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"layer vs Player" target:self selectorselector(callGame)];
CCMenuItemFont *menu2 = [CCMenuItemFont itemFromString"layer vs AI" target:self selectorselector(callGame)];
CCMenu *menu = [CCMenu menuWithItems:menu1, menu2, nil];
[menu alignItemsVerticallyWithPadding:5];
[self addChild:menu];
}
Best Answer-推荐答案 strong>
将 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 和操作(在需要时),然后应用所需的效果。
这似乎需要更多的工作,但如果您的游戏有几种不同的情况,您希望显示通用菜单按钮,那么您的代码可以更具可读性和可重用性,因为您所要做的就是创建菜单系统 future 使用这样的代码:
-(void) showNewGameMenuExpandedBOOL)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:@"layer vs Player" target:self selector:@selector(callGame)];
CCMenuItemFont *menu2 = [CCMenuItemFont itemFromString:@"layer vs AI" target:self selector:@selector(callGame)];
CCMenu *menu = [CCMenu menuWithItems:menu1, menu2, nil];
[menu alignItemsVerticallyWithPadding:5];
[self addChild:menu];
关于objective-c - 如何在 Cocos2d 中移动 CCMenu?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/11815525/
|