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

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

在cocos2dx種,有兩種方法來實現動畫,但是都比較費勁


第一種方法是:

首先自己使用代碼來實現動畫效果。思路如下:

1.使用精靈來加載每一張圖片。

2.按照一定的順序,每次顯示其中的一個精靈。

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);


更新函數:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章