1

我正在尝试通过使用 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 几乎没有关于所有最重要特性的文档。

谢谢。

4

1 回答 1

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;
    }
}

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

于 2012-06-12T20:05:53.340 回答