Cocos2D 2.0 - 使用CCSpriteBatchNode,CCMenuItem和CCmenu

时间:2012-06-12 19:24:28

标签: cocos2d-iphone

我正在尝试使用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];

这是一个令人印象深刻的消息,消息断言失败 - [CCMenuItemSprite addChild:z:tag:]

任何线索? BTW可以有人创建或指向一些教程,解释如何将这个CCSpriteBatchNode与其他元素一起用作CCMenus,CCMenuItems和其他美女吗? Cocos2D几乎没有关于所有最重要功能的文档。

感谢。

1 个答案:

答案 0 :(得分:1)

嗯,inputNormal和inputPress sprite是批处理节点的子节点。因此,当您尝试将它们作为子项再次添加到另一个节点后代时,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;
    }
}

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