¿Cómo reproducir animaciones en Cocos2d-x?

Respuestas:

9

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);   
MLProgrammer-CiM
fuente
Gracias, pero ¿qué es HelloWorld :: getPlayer ()? Tengo un bloqueo en el simulador de iPhone al agregar runAction (laanim); a mi código
2600
Puede usar un sprite o cualquier otro nodo que desee, tengo un método que devuelve un sprite estático llamado _player que he inicializado previamente.
MLProgrammer-CiM
Lo he editado para mayor claridad ahora :) De nada.
MLProgrammer-CiM
CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); no funciona con la versión actual de cocos2d-x. ¿Qué tiene que ser cambiado?
Ben
Probablemente, renovaron muchas cosas últimamente. No sé qué ahora, solo verifique su documentación y tal vez necesite un parámetro más / menos.
MLProgrammer-CiM
5

En la nueva versión de CoCos2dx (2.1.1) puede usar (está funcionando)

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
fuente
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 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

Creo que esta puede ser la solución para la pregunta de Ben también.

Ankur
fuente
0

Para cocos2dx-v3, necesitará algo como esto:

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

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.

TankorSmash
fuente
¿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 ...
Kaizer Sozay