Wie spiele ich Animationen in Cocos2d-x?

Antworten:

9

Sprite-Animation ist ziemlich einfach. Sie erstellen einfach einen CCAnimationKnoten, fügen die Bilder zur Schleife hinzu, erstellen dann eine Aktion mit CCAnimate::actionWithDuration(float, CCAnimation, bool)und lassen das Sprite sie ausführen.

Beispiel:

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
quelle
Danke, aber was ist HelloWorld :: getPlayer ()? Beim Hinzufügen von runAction (laanim) stürzt der iPhone-Simulator ab. zu meinem Code.
2600.
Sie können ein Sprite oder einen anderen gewünschten Knoten verwenden. Ich habe eine Methode, die ein statisches Sprite namens _player zurückgibt, das ich zuvor initialisiert habe.
MLProgrammer-CiM
Ich habe es jetzt aus Gründen der Klarheit bearbeitet :) Gern geschehen.
MLProgrammer-CiM
CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); funktioniert nicht mit der aktuellen Version von cocos2d-x. Was muss geändert werden?
Ben
Wahrscheinlich haben sie in letzter Zeit eine Menge Sachen überarbeitet. Keine Ahnung was jetzt, überprüfen Sie einfach die Dokumentation und vielleicht benötigen Sie einen Parameter mehr / weniger.
MLProgrammer-CiM
5

In der neuen Version von CoCos2dx (2.1.1) können Sie verwenden (es funktioniert)

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
quelle
Es gibt eine Bearbeitung auf diese Frage in der Bearbeitungs Warteschlange für die umbenennt spriteWithSpriteFramezu createWithSpriteFrame. Ich weiß nicht genug Cocos2D, um festzustellen, ob es sich um eine Verbesserung handelt. Würde die Bearbeitung diese Antwort verbessern?
Anko
2

Wenn Sie keine .plist- Datei verwenden und mit der Antwort von Ef Es mit der aktuellen Version von cocos2d-x fortfahren möchten, ändern Sie einfach einige Zeilen wie folgt:

    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

Ich denke, dies kann auch die Lösung für Bens Frage sein.

Ankur
quelle
0

Für cocos2dx-v3 benötigen Sie ungefähr Folgendes:

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

Konnte keinen anderen Weg finden. Sie können dieselben Frames auch immer wieder hinzufügen, um eine Pause einzuführen, aber ich bin mir sicher, dass es auch eine andere Möglichkeit gibt, dies zu tun.

TankorSmash
quelle
Können Sie mir sagen, wie Sie dieselbe Animation ausführen würden, aber die Sprites horizontal gespiegelt? Ich habe jetzt schon eine Weile damit zu kämpfen und setFlippedX (true) scheint es nicht zu tun ...
Kaizer Sozay