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)
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 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
Je pense que cela peut aussi être la solution à la question de Ben .
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 gothis->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 ...
Réponses:
L'animation de sprite est assez simple. Vous venez de créer un
CCAnimation
nœud, ajoutez les images à la boucle, puis créez une action à l'aideCCAnimate::actionWithDuration(float, CCAnimation, bool)
et faites exécuter le sprite.Exemple:
la source
CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true);
ne fonctionne pas avec la version actuelle de cocos2d-x. Que faut-il changer?Dans la nouvelle version de CoCos2dx (2.1.1), vous pouvez utiliser (cela fonctionne)
la source
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?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:
Je pense que cela peut aussi être la solution à la question de Ben .
la source
Pour cocos2dx-v3, vous aurez besoin de quelque chose comme ceci:
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.
la source