自定義動畫簡單的說就是,圖片按照必定的間隔時間、必定的順序、一幀一幀的進行播放顯示的效果。緩存
在cocos2dx種,有兩種方法來實現動畫,可是都比較費勁函數
第一種方法是:
oop
首先本身使用代碼來實現動畫效果。思路以下:動畫
1.使用精靈來加載每一張圖片。this
2.按照必定的順序,每次顯示其中的一個精靈。spa
3.不斷的循環顯示,動畫效果就出來了。索引
代碼以下:圖片
////----------------模擬動畫實現
//
//// //添加4個精靈,每一個精靈用來表示一幀
//// CCSprite* frame = CCSprite::create("crop1.png");
//// CCSprite* frame2 = CCSprite::create("crop2.png");
//// CCSprite* frame3 = CCSprite::create("crop3.png");
//// CCSprite* frame4 = CCSprite::create("crop4.png");
////
// //--另一種方式:
// CCSprite* frame = CCSprite::create("crop.png",CCRectMake(0, 0, 100, 86));
// CCSprite* frame2 = CCSprite::create("crop.png",CCRectMake(100, 0, 100, 86));
// CCSprite* frame3 = CCSprite::create("crop.png",CCRectMake(200, 0, 100, 86));
// CCSprite* frame4 = CCSprite::create("crop.png",CCRectMake(300, 0, 100, 86));
////
////
//
// //設置同樣的座標
// frame ->setPosition(ccp(100,180));
// frame2 ->setPosition(ccp(100,180));
// frame3 ->setPosition(ccp(100,180));
// frame4 ->setPosition(ccp(100,180));
//
// //設置2-4幀不可見,初始化時只顯示第一幀
// frame2->setVisible(false);
// frame3->setVisible(false);
// frame4->setVisible(false);
//
// //添加當前Lyaer中,tag按照順序0~3
// addChild(frame,0,0);
// addChild(frame2,0,1);
// addChild(frame3,0,2);
// addChild(frame4,0,3);
//
// //每0.5秒調用一次myUpdate(每0.5切換一幀)
// schedule(schedule_selector(HelloWorld::myUpdate), 0.5);ip
更新函數:ci
currentFrameIndex++;
//獲取當前全部精靈
CCArray* array = this->getChildren();
//防止下標超過最大tag的精靈
if(currentFrameIndex>=array->count()){
currentFrameIndex=0;
}
//隱藏全部的精靈
for (int i = 0; i<array->count(); i++) {
//根據tag索引每一幀並設置不可見
CCSprite* spT = (CCSprite*)this->getChildByTag(i);
spT->setVisible(false);
}
//讓下一幀顯示出來
CCSprite* sp = (CCSprite*)array->objectAtIndex(currentFrameIndex);
sp->setVisible(true);
第二種方法是:
使用plist文件,結合cocos2dx裏面的動畫類CCAnimation來實現,這種方式比較推薦
也有兩種方式:
代碼以下:
////---------------手動添加序列幀實現動畫
// CCSprite* sp = CCSprite::create("crop1.png");
// sp->setPosition(ccp(170,200));
// addChild(sp);
//
// CCAnimation* animation = CCAnimation::create();
// animation->addSpriteFrameWithFileName("crop1.png");
// animation->addSpriteFrameWithFileName("crop2.png");
// animation->addSpriteFrameWithFileName("crop3.png");
// animation->addSpriteFrameWithFileName("crop4.png");
// animation->setDelayPerUnit(2.8f / 14.0f);//必須設置不然不會動態播放
// animation->setRestoreOriginalFrame(true);//是否回到第一幀
// animation->setLoops(-1);//重複次數 (-1:無限循環)
// CCFiniteTimeAction * animate = CCAnimate::create(animation);
// sp->runAction(animate);
////---------------經過資源文件建立動畫 CCTexture2D::PVRImagesHavePremultipliedAlpha(true); CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("crop.plist"); //利用幀緩存建立精靈 CCSprite* sp = CCSprite::createWithSpriteFrameName("crop1.png"); sp->setPosition(ccp(170,200)); addChild(sp); CCArray* animFrames = CCArray::createWithCapacity(4); char str[100] = {0}; for(int i = 1; i < 5; i++) { sprintf(str, "crop%i.png", i); CCSpriteFrame *frame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(str); animFrames->addObject(frame); } CCAnimation *animation = CCAnimation::createWithSpriteFrames(animFrames, 0.3f); animation->setLoops(-1); sp->runAction(CCAnimate::create(animation)); CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrameByName("crop.plist")