La animación de Sprite es bastante simple. Simplemente cree un CCAnimationnodo, agregue las imágenes al bucle, luego cree una acción usando CCAnimate::actionWithDuration(float, CCAnimation, bool)y haga que el sprite lo ejecute.
Ejemplo:
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);
Hay una edición a esta pregunta en la cola de revisión de edición que renombra spriteWithSpriteFramea createWithSpriteFrame. No sé suficiente Cocos2D para saber si es una mejora. ¿La edición mejoraría esta respuesta?
Anko
2
Si no desea utilizar un archivo .plist y desea continuar con la respuesta de Ef Es con la versión actual de cocos2d-x, simplemente cambie algunas líneas de la siguiente manera:
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
Creo que esta puede ser la solución para la pregunta de Ben también.
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));
No fue capaz de avanzar de otra manera. También puede volver a agregar los mismos cuadros una y otra vez para introducir una pausa, pero estoy seguro de que también hay otra forma de hacerlo.
¿Puedes decirme cómo ejecutarías la misma animación, pero con los sprites volteados horizontalmente? He estado luchando con esto durante un tiempo, y setFlippedX (verdadero) no parece hacerlo ...
Respuestas:
La animación de Sprite es bastante simple. Simplemente cree un
CCAnimation
nodo, agregue las imágenes al bucle, luego cree una acción usandoCCAnimate::actionWithDuration(float, CCAnimation, bool)
y haga que el sprite lo ejecute.Ejemplo:
fuente
CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true);
no funciona con la versión actual de cocos2d-x. ¿Qué tiene que ser cambiado?En la nueva versión de CoCos2dx (2.1.1) puede usar (está funcionando)
fuente
spriteWithSpriteFrame
acreateWithSpriteFrame
. No sé suficiente Cocos2D para saber si es una mejora. ¿La edición mejoraría esta respuesta?Si no desea utilizar un archivo .plist y desea continuar con la respuesta de Ef Es con la versión actual de cocos2d-x, simplemente cambie algunas líneas de la siguiente manera:
Creo que esta puede ser la solución para la pregunta de Ben también.
fuente
Para cocos2dx-v3, necesitará algo como esto:
No fue capaz de avanzar de otra manera. También puede volver a agregar los mismos cuadros una y otra vez para introducir una pausa, pero estoy seguro de que también hay otra forma de hacerlo.
fuente