Comment jouer des animations dans Cocos2d-x?


Réponses:


9

L'animation de sprite est assez simple. Vous venez de créer un CCAnimationnœud, ajoutez les images à la boucle, puis créez une action à l'aide CCAnimate::actionWithDuration(float, CCAnimation, bool)et faites exécuter le sprite.

Exemple:

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

Merci mais qu'est-ce que HelloWorld :: getPlayer ()? Je reçois un crash sur le simulateur d'iPhone lors de l'ajout de runAction (laanim); à mon code.
2600th

Vous pouvez utiliser un sprite ou tout autre nœud que vous voulez, j'ai une méthode qui retourne un sprite statique appelé _player que j'ai précédemment initialisé.
MLProgrammer-CiM

Je l'ai édité pour plus de clarté maintenant :) Vous êtes les bienvenus.
MLProgrammer-CiM

CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); ne fonctionne pas avec la version actuelle de cocos2d-x. Que faut-il changer?
Ben

Probablement, ils ont réorganisé beaucoup de choses ces derniers temps. Vous ne savez pas quoi maintenant, il suffit de vérifier leur documentation et peut-être avez-vous besoin d'un paramètre de plus / moins.
MLProgrammer-CiM

5

Dans la nouvelle version de CoCos2dx (2.1.1), vous pouvez utiliser (cela fonctionne)

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

Il y a une modification à cette question dans la file d' attente modifier d'examen qui renomme spriteWithSpriteFrameà createWithSpriteFrame. Je ne connais pas assez Cocos2D pour dire s'il s'agit d'une amélioration. La modification améliorerait-elle cette réponse?
Anko

2

Si vous ne voulez pas utiliser un fichier .plist et souhaitez continuer avec la réponse d' Ef Es avec la version actuelle de cocos2d-x, changez simplement quelques lignes comme ci-dessous:

    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

Je pense que cela peut aussi être la solution à la question de Ben .


0

Pour cocos2dx-v3, vous aurez besoin de quelque chose comme ceci:

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'a pas pu faire autrement. Vous pouvez également rajouter les mêmes images encore et encore pour introduire une pause, mais je suis sûr qu'il y a une autre façon de le faire aussi.


Pouvez-vous me dire comment vous exécuteriez la même animation, mais avec les sprites inversés horizontalement? Je lutte avec cela depuis un moment maintenant, et setFlippedX (true) ne semble pas le faire ...
Kaizer Sozay
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.