जवाबों:
स्प्राइट एनीमेशन बहुत सरल है। आप बस एक 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);
CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true);
cocos2d-x के वर्तमान संस्करण के साथ काम नहीं करता है। क्या बदलना होगा?
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 नहीं है कि क्या यह एक सुधार है। क्या संपादन इस उत्तर को बेहतर करेगा?
यदि आप एक .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
मुझे लगता है कि यह बेन के सवाल का समाधान भी हो सकता है।
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));
किसी अन्य रास्ते से जाने में सक्षम नहीं था। आप एक ही फ़्रेम को फिर से जोड़ने के लिए एक बार फिर से एक पॉज़ को शुरू करने में सक्षम हैं, लेकिन मुझे यकीन है कि ऐसा करने का एक और तरीका भी है।