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);
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)
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 hereCCAnimation* 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 areathis->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 .
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 gothis->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.
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 ...
Respostas:
A animação do Sprite é bem simples. Você acabou de criar um
CCAnimation
nó, adicionar as imagens ao loop, criar uma ação usandoCCAnimate::actionWithDuration(float, CCAnimation, bool)
e fazer o sprite executá-lo.Exemplo:
fonte
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?Na nova versão do CoCos2dx (2.1.1) você pode usar (está funcionando)
fonte
spriteWithSpriteFrame
paracreateWithSpriteFrame
. Eu não sei o suficiente Cocos2D para dizer se é uma melhoria. A edição melhoraria esta resposta?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:
Eu acho que essa também pode ser a solução para a pergunta de Ben .
fonte
Para cocos2dx-v3, você precisará de algo como isto:
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.
fonte