【轉】cocos2dx 自學知識點之三 自定義動畫 使用plist來實現

 

自定義動畫簡單的說就是,圖片按照必定的間隔時間、必定的順序、一幀一幀的進行播放顯示的效果。緩存

在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")

相關文章
相關標籤/搜索