将 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];