Cocos2d-x animasyonları nasıl oynanır?


Yanıtlar:


9

Sprite animasyonu oldukça basittir. Sadece bir CCAnimationdüğüm oluşturun , döngüye görüntüleri ekleyin, sonra kullanarak bir eylem oluşturun CCAnimate::actionWithDuration(float, CCAnimation, bool)ve hareketli grafiğin çalıştırmasını sağlayın.

Misal:

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

Teşekkürler ama HelloWorld :: getPlayer () nedir? İPhone simülatöründe runAction (laanim) eklerken bir kilitlenme alıyorum; benim kodum.
2600

Bir sprite veya istediğiniz başka bir düğümü kullanabilirsiniz, daha önce başlattığım _player adlı statik bir sprite döndüren bir yöntemim var.
MLProgrammer-CiM

Şimdi anlaşılır olması için düzenledim :) Rica ederim.
MLProgrammer-CiM

CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); cocos2d-x'in mevcut sürümü ile çalışmaz. Ne değiştirilmeli?
Ben

Muhtemelen, son zamanlarda birçok şeyi yenilediler. Şimdi ne olduğunu bilmiyorsanız, belgelerini kontrol edin ve belki bir parametreye daha fazla / daha az ihtiyacınız var.
MLProgrammer-CiM

5

CoCos2dx (2.1.1) 'in yeni sürümünde kullanabilirsiniz (çalışıyor)

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

Adlandırır düzenleme inceleme kuyruğuna bu soruya bir düzenleme var spriteWithSpriteFrameetmek createWithSpriteFrame. Iyileştirmek için yeterli Cocos2D bilmiyorum. Düzenleme bu yanıtı iyileştirir mi?
Anko

2

Bir .plist dosyası kullanmak istemiyorsanız ve Ef Es'in cocos2d-x'in geçerli sürümüyle yanıtına devam etmek istiyorsanız , bazı satırları aşağıdaki gibi değiştirin:

    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

Ben'in bu sorunun da çözümü olabileceğini düşünüyorum .


0

Cocos2dx-v3 için şöyle bir şeye ihtiyacınız olacak:

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

Başka bir yoldan gidemedim. Ayrıca, duraklama yapmak için aynı kareleri tekrar tekrar ekleyebilirsiniz, ancak eminim bunu yapmanın başka bir yolu da vardır.


Bana aynı animasyonu nasıl yürüteceğinizi söyleyebilir misiniz, ancak spritelar yatay olarak çevrilmiş mi? Bir süredir bununla uğraşıyorum ve setFlippedX (true) bunu yapmıyor gibi görünüyor ...
Kaizer Sozay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.