1

我正在使用CCSpriteBatchNode 和 CCSpriteFrameCache通过SpriteSheets为整个身体制作动画。现在用户可以将他自己的图片添加到该主体中,当我尝试将Child添加到Spritesheet时会崩溃并出现错误“CCSprite 未使用相同的纹理 id”

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

4

3 回答 3

2

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

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

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]

于 2013-07-18T10:12:11.067 回答
0

您不能手动添加CCSpriteSpriteSheets因为当您使用纹理打包器创建动画 Sprite 时,我希望您知道它也是用.plist文件创建的,并且它会从它的大小中获取图像。

当您手动添加 CCSprite 时,也无法从SpriteFramesWithFile. 可能是你有错误。

在不使用纹理打包器的情况下添加动画 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];

上面的代码只是描述了如何在CCSprite不使用 纹理打包器的情况下添加动画

在这里,您还可以更改图像数组,以便您也可以手动添加图像。

于 2013-07-18T09:36:34.990 回答
0

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

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

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

于 2013-07-18T09:46:37.427 回答