“”CCSprite没有使用相同的纹理ID“”解决方法?

时间:2013-07-18 09:22:43

标签: ios cocos2d-iphone sprite-sheet texturepacker

我通过 SpriteSheets 使用 CCSpriteBatchNode和CCSpriteFrameCache 为整个机构制作动画。现在,用户可以将自己的图片添加到该主体,当我尝试 addChild Spritesheet 崩溃时出现错误 “CCSprite没有使用相同的纹理ID “

现在我知道面部 CCSprite 不在缓存/纹理中(它是通过 texturepacker 创建的)并且崩溃是正常的但我想知道是否有这是一个解决方法,因为我必须通过用户交互为该主体添加一个面并为该主体设置动画。到目前为止,使用spritesheets是动画的最佳选择。任何人??

3 个答案:

答案 0 :(得分:2)

在这种情况下,您可以做的是拍摄用户的照片,然后从用户的图像中制作纹理。 然后将该纹理添加到CCTextureCache。现在你有了用户图像的纹理。现在,您可以在动画中使用该纹理。

从Sprite制作纹理(您可以从用户图像制作精灵)

CCSprite *spr = nil;//your sprite
CCRenderTexture* renderTexture = [CCRenderTexture renderTextureWithWidth:spr.contentSize.width height:spr.contentSize.height];

spr.anchorPoint = ccp(0, 0);
spr.position = ccp(0, 0);
[renderTexture addChild:spr];  

[renderTexture begin];     
[spr draw]; // or [spr visit];
[renderTexture end];

CCTexture2D *result = renderTexture.sprite.texture;

将纹理添加到纹理缓存中。

[[CCTextureCache sharedTextureCache] addTexture]

答案 1 :(得分:0)

您无法手动将CCSprite添加到 SpriteSheets 。因为当您使用 texturepacker 创建动画精灵时,我希望您知道它也是使用.plist文件创建的,并且它会以其大小来显示它的图像。

当您手动添加CCSprite时,从SpriteFramesWithFile找不到它。可能你有错误。

在不使用 texturepacker 的情况下添加动画CCSprite的另一种方式

CCSprite *dog = [CCSprite spriteWithFile:@"dog1.gif"];
        dog.position = ccp(winSize.width/2, winSize.height/2);
        [self addChild:dog z:2];

        NSMutableArray *animFrames = [NSMutableArray array];
        for( int i=1;i<=5;i++)
        {
            NSString* file = [NSString stringWithFormat:@"dog%d.gif", i];
            CCTexture2D* texture = [[CCTextureCache sharedTextureCache] addImage:file];
            CGSize texSize = texture.contentSize;
            CGRect texRect = CGRectMake(0, 0, texSize.width, texSize.height);
            CCSpriteFrame* frame = [CCSpriteFrame frameWithTexture:texture rect:texRect];
            [animFrames addObject:frame];
        }
        CCAnimation * animation = [CCAnimation animationWithSpriteFrames:animFrames];
        animation.delayPerUnit = 0.07f;
        animation.restoreOriginalFrame = YES;

        CCAnimate *animAction  = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:animation]];
        [dog runAction:animAction];

以上代码描述了如何在不使用 texturepacker 的情况下添加动画CCSprite

此处您还可以更改图像数组,以便您也可以手动添加图像。

答案 2 :(得分:0)

创建CCSpriteBatchNode时,它会链接到一个texture。这是CCSpriteBatchNode的要点:绘制使用相同纹理的不同精灵来减少OpenGL绘制调用并提高效率。

最简单的解决方法(如果您尚未达到性能关键点)将使用常规CCLayer而不是CCSpriteBatchNode

如果您仍想将不同的CCSprites(例如,身体,四肢和角色的头部)添加到同一CCSpriteBatchNode,则需要构建一个精灵表(或者纹理包),其中包含您需要添加到CCSpriteBatchNode的所有身体部位。这个单精灵表将是CCSpriteBatchNode将使用的唯一精灵表。您将无法添加未使用此精灵表的CCSprites