I have a spriteshit ninja. I want to play an animation.
SpriteBatchNode* spritebatch = SpriteBatchNode::create("ninja.png");
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ninja.plist");
addChild(spritebatch);
spritebatch->setPosition(100, 100);
Vector<SpriteFrame*> animFrames(8);
const int kNumberOfFrames = 8;
for( int i = 0; i < kNumberOfFrames; i++ )
{
String* filename = String::createWithFormat("walking_e%04d.png", i);
animFrames.pushBack(SpriteFrameCache::getInstance()->getSpriteFrameByName(filename->getCString()));
}
auto animation = Animation::createWithSpriteFrames(animFrames, 0.5f);
Sprite* sprite = Sprite::create();
sprite->runAction( CCRepeatForever::create( CCAnimate::create(animation) ) );
spritebatch->addChild(sprite);
I have wrote this code and it crashes on line spritebatch->addChild(sprite);. What is wrong? Please help.
Here is the crash message:
I turns that I should do addChild(sprite) instead of spritebatch->addChild(sprite);. Why?
Capture.PNG (28.7 KB)
Capture.PNG (28.7 KB)
I have done this and it worked:
SpriteBatchNode* spritebatch = SpriteBatchNode::create("ninja.png");
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ninja.plist");
Sprite * pSprite0 = CCSprite::createWithSpriteFrameName("walking_e0001.png");
spritebatch->addChild(pSprite0);
Sprite * pSprite00 = CCSprite::createWithSpriteFrameName("walking_e0003.png");
pSprite00->setPosition(50,50);
spritebatch->addChild(pSprite00);
addChild(spritebatch);
spritebatch->setPosition(100, 100);
Animation *anim = Animation::create();
for (int i = 0; i < 8; i ++)
{
std::ostringstream filenameStream;
filenameStream << "walking_e000" << i << ".png";
SpriteFrame *frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(filenameStream.str().c_str());
anim->addSpriteFrame(frame);
}
anim->setDelayPerUnit(0.08f);
AnimationCache::getInstance()->addAnimation(anim, "ninja_walk");
Sprite * pSprite1 = CCSprite::create();
pSprite1->runAction(CCRepeatForever::create( CCAnimate::create(anim)));
pSprite1->setPosition(200, 200);
addChild(pSprite1);
Animation * animation = AnimationCache::getInstance()->getAnimation("ninja_walk");
Sprite * pSprite2 = CCSprite::create();
pSprite2->runAction(CCRepeatForever::create( CCAnimate::create(animation)));
pSprite2->setPosition(300, 300);
addChild(pSprite2);
Sprite * pSprite3 = CCSprite::create();
pSprite3->runAction(CCRepeatForever::create( CCAnimate::create(animation)));
pSprite3->setPosition(400, 400);
addChild(pSprite3);
For all 3 animations I have only 1 draw call, and also another draw call for all 2 static sprites :). But what I don’t understand still is: why in case of static sprite I addChild() it to the batchnode while for the animation I addChild to the Layer.