Come riprodurre le animazioni in Cocos2d-x?


Risposte:


9

L'animazione Sprite è piuttosto semplice. Devi solo creare un CCAnimationnodo, aggiungere le immagini al loop, quindi creare un'azione usando CCAnimate::actionWithDuration(float, CCAnimation, bool)e far eseguire lo sprite.

Esempio:

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);   

Grazie, ma cos'è HelloWorld :: getPlayer ()? Ho un arresto anomalo sul simulatore di iPhone durante l'aggiunta di runAction (laanim); al mio codice.
2600

Puoi usare uno sprite o qualsiasi altro nodo che desideri, ho un metodo che restituisce uno sprite statico chiamato _player che ho precedentemente inizializzato.
MLProgrammer-CiM

L'ho modificato per chiarezza ora :) Prego.
MLProgrammer-CiM

CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); non funziona con la versione corrente di cocos2d-x. Cosa deve essere cambiato?
Ben

Probabilmente, hanno rinnovato molte cose ultimamente. Non so cosa ora, basta controllare la loro documentazione e forse hai bisogno di un parametro più / meno.
MLProgrammer-CiM

5

Nella nuova versione di CoCos2dx (2.1.1) è possibile utilizzare (funziona)

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) );

C'è una modifica a questa domanda nella coda di revisione di modifica, che rinomina spriteWithSpriteFramea createWithSpriteFrame. Non so abbastanza Cocos2D da dire se si tratta di un miglioramento. La modifica migliorerebbe questa risposta?
Anko,

2

Se non vuoi usare un file .plist e vuoi continuare con la risposta di Ef Es con la versione corrente di cocos2d-x, cambia alcune righe come di seguito:

    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

Penso che questa possa essere la soluzione anche alla domanda di Ben .


0

Per cocos2dx-v3, avrai bisogno di qualcosa del genere:

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));

Non sono riuscito a fare altro. Puoi anche aggiungere nuovamente gli stessi frame più e più volte per introdurre una pausa, ma sono sicuro che ci sia anche un altro modo di farlo.


Puoi dirmi come faresti con la stessa animazione, ma con gli sprite ruotati orizzontalmente? Sono stato alle prese con questo per un po 'di tempo, e setFlippedX (true) non sembra farlo ...
Kaizer Sozay
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.