Como reproduzir animações no Cocos2d-x?

Respostas:

9

A animação do Sprite é bem simples. Você acabou de criar um CCAnimationnó, adicionar as imagens ao loop, criar uma ação usando CCAnimate::actionWithDuration(float, CCAnimation, bool)e fazer o sprite executá-lo.

Exemplo:

CCAnimation * anim = CCAnimation::animation();
// There are other several ways of storing + adding frames, 
// this is the most basic using one image per frame.
anim->addFrameWithFileName("bear1.png");
anim->addFrameWithFileName("bear2.png");
anim->addFrameWithFileName("bear3.png");
anim->addFrameWithFileName("bear4.png");
anim->addFrameWithFileName("bear5.png");
anim->addFrameWithFileName("bear6.png");
anim->addFrameWithFileName("bear7.png");
anim->addFrameWithFileName("bear8.png");

CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); 
// Duration, animation action and bool to return to frame 1 after finishing.

CCSprite *bear = CCSprite::spriteWithFile("bear1.png");
addChild(bear,0); //Don't forget to add any sprite you use as a child to the CCLayer!
bear->runAction(theAnim);   
MLProgrammer-CiM
fonte
Obrigado, mas o que é o HelloWorld :: getPlayer ()? Estou tendo uma falha no simulador do iPhone ao adicionar runAction (laanim); ao meu código.
2600
Você pode usar um sprite ou qualquer outro nó que desejar. Eu tenho um método que retorna um sprite estático chamado _player que eu inicializei anteriormente.
Programador-CiM
Eu editei para maior clareza agora :) De nada.
Programador-CiM
CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); não funciona com a versão atual do cocos2d-x. O que tem que ser mudado?
Ben
Provavelmente, eles renovaram muitas coisas ultimamente. Não sei o que agora, basta verificar a documentação e talvez você precise de um parâmetro mais / menos.
MLProgrammer-CiM
5

Na nova versão do CoCos2dx (2.1.1) você pode usar (está funcionando)

CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile("numbers.plist","numbers.png");

CCSprite* sprite = CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("slice2_0_0.png"));
sprite->setPosition(ccp(GameScene::windowSize.width/2,GameScene::windowSize.height/3));

CCSpriteBatchNode* spriteBatchNode = CCSpriteBatchNode::create("numbers.png");
spriteBatchNode->addChild(sprite);
addChild(spriteBatchNode);

CCArray* animFrames = CCArray::createWithCapacity(10);

char str[100] = {0};
for(int i = 0; i < 10; ++i)
{
    sprintf(str, "slice2_0_%d.png", i);
    CCSpriteFrame* frame = cache->spriteFrameByName( str );
    animFrames->addObject(frame);
}
CCAnimation* animation = CCAnimation::createWithSpriteFrames(animFrames,1.f);
sprite->runAction(CCAnimate::create(animation) );
Dawid Drozd
fonte
Há uma edição para esta pergunta na fila de revisão de edição que renomeia spriteWithSpriteFramepara createWithSpriteFrame. Eu não sei o suficiente Cocos2D para dizer se é uma melhoria. A edição melhoraria esta resposta?
Anko
2

Se você não deseja usar um arquivo .plist e deseja continuar com a resposta dos Ef Es com a versão atual do cocos2d-x, basta alterar algumas linhas, como abaixo:

    CCSprite * sprite  = CCSprite::create("bear1.png"); // NEW - create a sprite here
    CCAnimation * anim = CCAnimation::animation();
    // There are other several ways of storing + adding frames, 
    // this is the most basic using one image per frame.
    anim->addSpriteFrameWithFileName("bear1.png");
    anim->addSpriteFrameWithFileName("bear2.png");
    anim->addSpriteFrameWithFileName("bear3.png");
    anim->addSpriteFrameWithFileName("bear4.png");
    anim->addSpriteFrameWithFileName("bear5.png");
    anim->addSpriteFrameWithFileName("bear6.png");
    anim->addSpriteFrameWithFileName("bear7.png");
    anim->addSpriteFrameWithFileName("bear8.png");

    anim->setLoops(-1); // for infinit loop animation
    anim->setDelayPerUnit(0.1f); //Duration per frame
    //CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); // this wont work in newer version..

    sprite->runAction(CCAnimate::create(anim) );
    sprite->setPosition(ccp(200,200)); //set position of sprite in some visible area

    this->addChild(sprite, 1); // cross check the Z index = 1 with your code

Eu acho que essa também pode ser a solução para a pergunta de Ben .

Ankur
fonte
0

Para cocos2dx-v3, você precisará de algo como isto:

auto cache = SpriteFrameCache::getInstance();
Vector<SpriteFrame*> frames = Vector<SpriteFrame*>();

frames.pushBack(cache->getSpriteFrameByName("open.png"));
frames.pushBack(cache->getSpriteFrameByName("closed.png"));
frames.pushBack(cache->getSpriteFrameByName("closed.png"));
cocos2d::Animation* anim = cocos2d::Animation::createWithSpriteFrames(frames, 0.1f, 1);

cocos2d::Animate* anim_action = cocos2d::Animate::create(anim);
//sprite is already added to scene elsewhere and ready to go
this->sprite->runAction(RepeatForever::create(anim_action));

Não foi possível seguir outro caminho. Você também pode adicionar novamente os mesmos quadros repetidamente para introduzir uma pausa, mas tenho certeza de que há outra maneira de fazer isso também.

TankorSmash
fonte
Você pode me dizer como executaria a mesma animação, mas com os sprites invertidos horizontalmente? Eu estive lutando com isso por um tempo agora, e não setFlippedX (true) não parecem fazê-lo ...
Kaizer Sozay