2

我正在尝试为我的游戏制作各种物品滚动条。我决定使用扩展名CCMenuAdvanced,并且能够使用工作按钮实现一个工作菜单列表。但是,我不太明白如何正确地将我的菜单包含在边界矩形中。我很清楚,boundaryRect 不会使菜单列表的“越界”部分消失——它似乎只负责滚动。那么问题是我还需要做什么来获得一个独立的项目列表CCMenuAdvanced,当不再处于边界时,它会变得不可见且无响应?我是否必须安排一个额外的更新方法来跟踪单个元素的位置并更改它们的不透明度和可见性,或者是否有支持的解决方案?

    NSArray *menuItems = [self labelsFromInventory];
    CCMenuAdvanced *menu = [CCMenuAdvanced menuWithItems: nil]; 
    for (CCMenuItem *item in menuItems)
        [menu addChild: item];  

    [menu alignItemsVerticallyWithPadding: 10 bottomToTop: NO]; //< also sets contentSize and keyBindings on Mac
    //menu.isRelativeAnchorPoint = YES; 
    menu.position = ccp(30, 40);
    [self addChild:menu z:2 tag:101];

    menu.scale = MIN ((winSize.width / 2.0f) / menu.contentSize.width, 0.75f );
    menu.boundaryRect = CGRectMake(menu.position.x, menu.position.y, 190.0, 20.0);
    [menu fixPosition];

谢谢

4

2 回答 2

3

不幸的是,在 Cocos2d 中,项目不会裁剪到边界。因此,当一个项目超出其边界时,它只会继续运行,直到 a) 它离开主窗口边界或 b) 它落在 z 顺序中的另一个项目“之下”。

为了做你想做的事,你可以首先尝试向图层添加另一个精灵,它是一种“不透明蒙版”,在 z 顺序中高于可滚动部分,这样,当项目滚动超出其边界时容器,它将被较高的 z 顺序项目“隐藏”。

备用路线,也是我采用的路线,使用 a UIView(在我的情况下是 a UITableView)并使用CCUIViewWrapper将其包装以将其添加到窗口中。在这种情况下,您必须记住,该UIView项目将始终放置在您的 GL 视图中的所有内容之上,并且它不能很好地与事物配合使用,因此需要一些技巧才能开始工作。好消息是,您可以使用 Interface Builder 来设计您的界面,并且您将获得开箱即用的滚动遮罩等功能。

无论哪种方式都是一种权衡;目前在 Cocos2d 中确实没有简单的解决方案——至少,我不知道。

于 2012-08-06T02:23:33.677 回答
1

我从 CCMenuAdvanced 开始创建一个夹在边界框中的菜单。我没有移动菜单的位置,而是选择移动菜单中包含的菜单项的位置。这使我能够设置菜单项的可见性和其他属性(如果它们将超出边界)(我向菜单添加了一个边界框属性,以及菜单项之间的间距、顶部的高度和底部缓冲区(以点为单位)。我的滚动菜单还提供了一个顶部和底部缓冲区,当接近顶部或底部时,我会淡出菜单项。

我在 ccTouchMoved 方法中确定是否可以移动(即菜单项已经处于它们可能的最大 Y 或最小 Y)。如果可以移动,我将 deltaY 应用于所有菜单项并设置每个菜单项的不透明度和可见性属性。最困难的部分是夹紧。

于 2012-08-07T00:30:27.333 回答