CCSprite не использует тот же обходной путь идентификатора текстуры?

Я анимирую все тело через SpriteSheets с помощью CCSpriteBatchNode и CCSpriteFrameCache. Теперь пользователь может добавить свою собственную картинку в это тело, которое, когда я пытаюсь добавить дочерний элемент в Spritesheet, вылетает с ошибкой "CCSprite не использует тот же идентификатор текстуры "

Теперь я знаю, что лицо CCSprite не было в этом кеше/текстуре (оно было создано с помощью texturepacker), и сбой был нормальным, но я хотел знать, есть ли обходной путь для это потому, что я должен добавить лицо к этому телу через взаимодействие с пользователем и анимировать это тело. И, безусловно, использование спрайтов — лучший вариант для анимации. кто-нибудь??


person hemant    schedule 18.07.2013    source источник


Ответы (3)


В этом случае вы можете сделать снимок пользователя, а затем сделать текстуру из изображения пользователя. Затем добавьте эту текстуру в 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]

person Renaissance    schedule 18.07.2013

Когда вы создаете CCSpriteBatchNode, он связывается с одним texture. В этом смысл CCSpriteBatchNode: рисовать разные спрайты, использующие одну и ту же текстуру, чтобы уменьшить количество вызовов отрисовки OpenGL и повысить эффективность.

Самым простым обходным решением (если вы не достигли критической точки производительности) было бы использование обычного CCLayer вместо CCSpriteBatchNode.

Если вы все еще хотите добавить разные CCSprites (скажем, тело, конечности и голову вашего персонажа) к одному и тому же CCSpriteBatchNode, вам нужно создать один лист спрайтов (или пакет текстур), который содержит все части тела, которые вы нужно добавить в CCSpriteBatchNode. Этот единственный лист спрайтов будет единственным, который будет использовать CCSpriteBatchNode. Вы не сможете добавить CCSprites, которые не используют этот лист спрайтов.

person Ricardo Sanchez-Saez    schedule 18.07.2013

Вы не можете вручную добавить CCSprite в SpriteSheets. Потому что, когда вы создаете анимированный спрайт с помощью texturepacker, я надеюсь, что вы знаете, что он также создан с файлом .plist, и он загружает из него изображение с его размером.

Когда вы добавляете вручную CCSprite, он не найден из SpriteFramesWithFile. может у тебя ошибка.

еще один способ добавить анимированный CCSprite без использования texturepacker

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 без использования texturepacker.

Здесь вы также можете изменить массив изображений, чтобы вы также могли добавлять изображения вручную.

person iPatel    schedule 18.07.2013