Câu trả lời:
Hoạt hình Sprite khá đơn giản. Bạn chỉ cần tạo một CCAnimation
nút, thêm hình ảnh vào vòng lặp, sau đó tạo một hành động bằng cách sử dụng CCAnimate::actionWithDuration(float, CCAnimation, bool)
và làm cho sprite chạy nó.
Thí dụ:
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);
không hoạt động với phiên bản hiện tại của cocos2d-x. Điều gì phải thay đổi?
Trong phiên bản mới của CoCos2dx (2.1.1), bạn có thể sử dụng (nó đang hoạt động)
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
thành createWithSpriteFrame
. Tôi không biết đủ Cocos2D để biết đó có phải là một cải tiến hay không. Chỉnh sửa sẽ cải thiện câu trả lời này?
Nếu bạn không muốn sử dụng tệp .plist và muốn tiếp tục với câu trả lời của Ef Es với phiên bản hiện tại của cocos2d-x, chỉ cần thay đổi một số dòng như dưới đây:
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
Tôi nghĩ rằng đây cũng có thể là giải pháp cho câu hỏi của Ben .
Đối với cocos2dx-v3, bạn sẽ cần một cái gì đó như thế này:
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));
Không thể có cách nào khác đi. Bạn cũng có thể thêm lại nhiều khung hình giống nhau để giới thiệu tạm dừng, nhưng tôi chắc chắn cũng có một cách khác để làm điều đó.