【问题标题】:Cocos2D 2.0 - using CCSpriteBatchNode, CCMenuItem and CCmenuCocos2D 2.0 - 使用 CCSpriteBatchNode、CCMenuItem 和 CCmenu
【发布时间】:2012-06-13 04:05:53
【问题描述】:

我正在尝试通过使用 CCSpriteBatchNode 来减少 OpenGL 调用次数和内存使用量。

我需要使用此代码创建一个 CCMenu:

CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithFile:@"atlasGeral.png"];

CCSprite *inputNormal = [CCSprite spriteWithSpriteFrameName:@"normalInput.png"];
CCSprite *inputPressed = [CCSprite spriteWithSpriteFrameName:@"PressedInput.png"];
[batchNode addChild:inputNormal];
[batchNode addChild:inputPressed];


CCMenuItem *input = 
    [CCMenuItemSprite itemWithNormalSprite:inputNormal
                           selectedSprite:inputPressed
                                   target:self 
                                 selector:@selector(InputMenu:)];
CCMenu *mInputMenu = [CCMenu menuWithItems:input, nil];

这是灾难性的崩溃,消息 Assertion failure in -[CCMenuItemSprite addChild:z:tag:]

有什么线索吗?顺便说一句,有人可以创建或指向一些教程来体面地解释如何将此 CCSpriteBatchNode 与这些其他元素(如 CCMenus、CCMenuItems 和其他美女)一起使用吗? Cocos2D 几乎没有关于所有最重要特性的文档。

谢谢。

【问题讨论】:

    标签: cocos2d-iphone


    【解决方案1】:

    好吧,inputNormal 和 inputPress 精灵是批处理节点的子节点。因此,当您尝试再次将它们作为子节点添加到另一个节点后代时,coco 会抱怨,因为它们已经有了父节点。恐怕做不到。 imnsho,批处理节点被严重高估了。只有在极少数和有限的用例中才能获得改进的收益。

    同样,直接来自 CCMenuItemSprite 代码(版本 1.0.1)

    -(void) setNormalImage:(CCNode <CCRGBAProtocol>*)image
    {
        if( image != normalImage_ ) {
            image.anchorPoint = ccp(0,0);
            image.visible = YES;
    
            [self removeChild:normalImage_ cleanup:YES];
            [self addChild:image];
    
            normalImage_ = image;
        }
    }
    

    菜单项尝试将(已经是子项)精灵添加到自身。没有豆子。

    【讨论】:

    • 谢谢。在我看来,这些 CCSpriteBatchNode 远非真正有用的东西。它们的用途非常有限,问题也很多。也许唯一的解决方案是创建我自己的类似 CCMenu 的类!
    • CCSpriteBatchNode 如果图像相当大,或者它们大部分是缩放和旋转的,则可以节省大量性能。由于 sprite 批处理节点除了只允许 sprite 作为子节点之外没有其他限制,因此请尝试尽早将它们合并到您的设计中。
    • @LearnCocos2D - 同意您提到的用例,假设您没有尝试在一个层中的不同 zOrders 处交错来自多个纹理的图形对象。我可能错过了如何将多个批处理节点添加到图层,但所有子精灵都被引用到唯一的 z 轴(图层的)。
    • @LearnCocos2D 同意!在我正在进行的一个项目中,我有一个七层的精灵。如果没有使用批处理节点来处理构成这些层的所有图像,性能就很糟糕。也就是说,我在我当前的项目中使用它们,但是批处理节点中的节点实际上并不是它们是视觉子级的视觉父级的子级,这意味着对视觉父级的操作,例如缩放、位置等然后不应用于视觉孩子。这使得使用批处理节点比应有的复杂得多,这是一种耻辱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多