【问题标题】:Using CCMenuAdvanced - Cocos2d使用 CCMenuAdvanced - Cocos2d
【发布时间】:2012-08-06 00:08:54
【问题描述】:

我正在尝试为我的游戏制作各种物品滚动条。我决定使用扩展名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];

谢谢

【问题讨论】:

    标签: iphone objective-c menu cocos2d-iphone ccmenuitem


    【解决方案1】:

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

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

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

    任何一种方式都是一种权衡;目前在 Cocos2d 中确实没有简单的解决方案——至少,据我所知没有。

    【讨论】:

    • 啊,这很有趣。我很早就考虑在我的 Cocos2d 项目中实现 UIKit,但我查看的文档包含太多开销,不值得。不过,我不知道 CCUIViewWrapper。现在正在调查它。您是否知道任何示例项目试图实现类似于我打算使用此类的东西?谢谢。
    • 特别是,您可以使用此类将 cocos2d 元素与 UI 元素一起变形吗?就像将我的 CCMenuAdvanced 添加到 UIScrollView 一样?谢谢。
    • 变形是什么意思?例如,您可以使用包装器在(例如 FadeIn、FadeOut 等)上使用 CCactions。至于将 CCNodes 添加到 UIView,我不太确定,因为我没有尝试过。本能地,我想说不,那是行不通的,如果只是因为 UIView 将始终位于您的 GL 视图之上,无论如何,并且考虑到您的 CCNode 的东西是 GL ......例如,替代方案是,使用 UIImageView 等来实现这些项目,以及使用 Interface Builder 将 UIItem 风格化为“适合” GL 视图。
    • 好的,我明白了...感谢您的意见。我可能会决定在稍后阶段更新我的项目并合并 UIKit。
    【解决方案2】:

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

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

    【讨论】:

    • 您是否继承了 CCMenuAdvanced 的子类来完成此操作?任何细节或现有示例将不胜感激。我和许多其他非凡的程序员一样,更喜欢修补现有代码而不是从头开始。谢谢。
    • 实际上,有太多的“修补”要做,除了添加我自己的属性和东西之外,我最终不得不重写一堆东西。我最终在我的代码中复制了该类并重写(谨慎:))一些方法。
    • 查看我的答案,了解部分谜题。 stackoverflow.com/questions/10936436/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多