উত্তর:
স্প্রাইট অ্যানিমেশন বেশ সহজ। আপনি কেবল একটি 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);
কোকোস 2 ডি-এক্স এর বর্তমান সংস্করণে কাজ করে না। কী বদলাতে হবে?
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
। এটির উন্নতি কিনা তা জানাতে আমি পর্যাপ্ত কোকোস 2 ডি জানি না। সম্পাদনা কি এই উত্তরটির উন্নতি করবে?
আপনি যদি একটি .লিস্ট ফাইলটি ব্যবহার করতে না চান এবং ইফ এস এর উত্তরটি কোকোস 2 ডি-এক্স এর বর্তমান সংস্করণ সহ চালিয়ে যেতে চান , তবে নীচের মতো কিছু লাইন পরিবর্তন করুন:
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));
অন্য কোনও পথে যেতে সক্ষম ছিল না। আপনি বিরতি দেওয়ার জন্য বারবার একই ফ্রেমগুলিকে পুনরায় যুক্ত করতে সক্ষম হন তবে আমি নিশ্চিত যে এটি করার আরও একটি উপায় আছে।