Cocos2d-x में एनिमेशन कैसे खेलें?


जवाबों:


9

स्प्राइट एनीमेशन बहुत सरल है। आप बस एक CCAnimationनोड बनाते हैं, छवियों को लूप में जोड़ते हैं, फिर एक क्रिया का उपयोग करके CCAnimate::actionWithDuration(float, CCAnimation, bool)बनाते हैं और स्प्राइट को चलाते हैं।

उदाहरण:

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

धन्यवाद, लेकिन क्या है HelloWorld :: getPlayer ()? मैं iPhone सिम्युलेटर पर रनएशन (laanim) जोड़ने पर दुर्घटनाग्रस्त हो रहा हूं; मेरे कोड के लिए।
2600 वीं

आप एक स्प्राइट या किसी अन्य नोड का उपयोग कर सकते हैं, जो आप चाहते हैं, मेरे पास एक विधि है जो एक स्थिर स्प्राइट लौटाती है जिसे _player कहा जाता है जिसे मैंने किसी भी प्रारंभिक रूप से संशोधित किया है।
MLProgrammer-CiM

मैंने इसे अब स्पष्टता के लिए संपादित किया :) आपका स्वागत है।
MLProgrammer-CiM

CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); cocos2d-x के वर्तमान संस्करण के साथ काम नहीं करता है। क्या बदलना होगा?
बेन

शायद, उन्होंने हाल ही में बहुत सारे सामान को फिर से बनाया। डननो अब क्या है, बस उनके प्रलेखन की जांच करें और हो सकता है कि आपको एक पैरामीटर अधिक / कम की आवश्यकता हो।
MLProgrammer-CiM

5

CoCos2dx (2.1.1) के नए संस्करण में आप इसका उपयोग कर सकते हैं (यह काम कर रहा है)

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

इस प्रश्न को संपादित समीक्षा कतार में संपादित करना है, जिसका नाम बदल spriteWithSpriteFrameजाता है createWithSpriteFrame। मुझे यह बताने के लिए पर्याप्त Cocos2D नहीं है कि क्या यह एक सुधार है। क्या संपादन इस उत्तर को बेहतर करेगा?
एको

2

यदि आप एक .plist फ़ाइल का उपयोग नहीं करना चाहते हैं और cocos2d-x के वर्तमान संस्करण के साथ Ef Es के उत्तर को जारी रखना चाहते हैं , तो बस नीचे कुछ पंक्तियाँ बदलें:

    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

मुझे लगता है कि यह बेन के सवाल का समाधान भी हो सकता है।


0

Cocos2dx-v3 के लिए, आपको कुछ इस तरह की आवश्यकता होगी:

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

किसी अन्य रास्ते से जाने में सक्षम नहीं था। आप एक ही फ़्रेम को फिर से जोड़ने के लिए एक बार फिर से एक पॉज़ को शुरू करने में सक्षम हैं, लेकिन मुझे यकीन है कि ऐसा करने का एक और तरीका भी है।


क्या आप बता सकते हैं कि आप एक ही एनीमेशन कैसे चलाएंगे, लेकिन स्प्राइट्स के साथ क्षैतिज रूप से फ़्लिप किया जाता है? मैं थोड़ी देर के लिए इस के साथ संघर्ष कर रहा हूँ, और setFlippedX (सच) ऐसा करने के लिए प्रतीत नहीं होता है ...
कैसर सोज़े
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.