原創文章,轉載請註明出處:http://blog.csdn.net/zhy_cheng/article/details/8271154
Cocos2d-x提供的動畫主要是瞬時動畫和延時動畫。
瞬時動作就是不需要時間,馬上就完成的動作。瞬時動作的共同基類是CCActionInstant。
延時動作就是指動作的完成需要一段時間。因此,幾乎所有的延時動作都使用執行時間作爲第一個參數,它們有着共同的基類CCActionInterval。
1.瞬時動畫
CCSprite *s=CCSprite::create("iconccc.png");//創建精靈
s->setPosition(ccp(200,200));//設置位置
addChild(s);//添加
CCActionInstant *ix=CCFlipX::actionWithFlipX(1);//x翻轉
CCActionInstant *iy=CCFlipY::actionWithFlipY(1);//y翻轉
s->runAction(ix);//運行
s->runAction(iy);
運行效果:2.延時動畫
CCXxxxTo - 絕對動作,執行的結果與當前的狀態關係不密切;
CCXxxxBy - 相對動作,在當前的狀態上執行某種動作,執行的結果與當前狀態是緊密相關的。
移動到 - CCMoveTo
移動 - CCMoveBy
跳躍到 - CCJumpTo
參數爲終點位置、跳躍高度和跳躍次數。
跳躍 - CCJumpBy
貝賽爾曲線 - CCBezierBy
支持三次貝賽爾曲線:P0-起點,P1-起點切線方向,P2-終點切線方向,P3-終點。
首先設置貝塞爾參數,然後執行。
放大到 - CCScaleTo
放大 - CCScaleBy
如果參數爲小數,那就是縮小了。
旋轉到 - CCRotateTo
旋轉 - CCRotateBy
閃爍 - CCBlink
色調變化到 - CCTintTo
色調變換 - CCTintBy
變暗到 - CCFadeTo
由無變亮 - CCFadeIn
由亮變無 - CCFadeOut
CCActionInterval *ac=CCRotateBy::actionWithDuration(2,270);
s->runAction(ac);
旋轉270度。
還有一些組合動畫
CCsequence
序列的使用非常簡單,該類從CCActionInterval派生,本身就可以被CCNode對象執行。該類的作用就是線性排列若干個動作,然後按先後次序逐個執行。 CCActionInterval *ac=CCRotateBy::actionWithDuration(2,270);
CCActionInterval *bc=CCBlink::actionWithDuration(3,10);
CCActionInterval *mc=CCMoveTo::actionWithDuration(2,CCPoint(300,200));
CCActionInterval *jc=CCJumpTo::actionWithDuration(3,CCPoint(400,400),20,4);
CCFiniteTimeAction *se=CCSequence::actions(ac,bc,mc,jc,NULL);
s->runAction(se);
上面的代碼一次執行。
CCActionInterval *ac=CCRotateBy::actionWithDuration(2,270);
CCActionInterval *sc=CCScaleBy::actionWithDuration(2,2,2);
CCFiniteTimeAction *se=CCSpawn::actions(ac,sc,NULL);
s->runAction(se);
上面的動畫同時執行。
CCActionInterval *sc=CCScaleBy::actionWithDuration(2,2,2);
CCFiniteTimeAction *se=CCSpawn::actions(ac,sc,NULL);
CCActionInterval *rc=CCRepeat::actionWithAction(se,4);
上面的代碼執行四次
CCActionInterval *ac=CCRotateBy::actionWithDuration(2,270);
CCActionInterval *sc=CCScaleBy::actionWithDuration(2,2,2);
CCFiniteTimeAction *se=CCSpawn::actions(ac,sc,NULL);
CCFiniteTimeAction *rrc=se->reverse();
CCFiniteTimeAction *lc=CCSequence::actions(se,rrc,NULL);
上面的動畫將還原。
CCActionInterval *ac=CCRotateBy::actionWithDuration(2,270);
CCActionInterval *sc=CCScaleBy::actionWithDuration(2,2,2);
CCFiniteTimeAction *se=CCSpawn::actions(ac,sc,NULL);
CCFiniteTimeAction *rrc=se->reverse();
CCFiniteTimeAction *lc=CCSequence::actions(se,CCDelayTime::actionWithDuration(3),rrc,NULL);
CCActionInterval *ac=CCRotateBy::actionWithDuration(2,270);
CCActionInterval *sc=CCScaleBy::actionWithDuration(2,2,2);
CCFiniteTimeAction *se=CCSpawn::actions(ac,sc,NULL);
CCFiniteTimeAction *rrc=se->reverse();
CCFiniteTimeAction *func=CCCallFunc::actionWithTarget(this,callfunc_selector(HelloWorld::backFunc));
CCFiniteTimeAction *lc=CCSequence::actions(se,func,CCDelayTime::actionWithDuration(3),rrc,NULL);
在se動畫運行完了之後調用函數。
CCCallFuncN
函數無返回值,有一個CCNode*的指針
CCSprite *s=CCSprite::create("sprite.png");
s->setPosition(ccp(0,0));
addChild(s);
CCActionInterval *move=CCMoveBy::create(3,ccp(450,290));
CCFiniteTimeAction *fn=CCCallFuncN::actionWithTarget(this,callfuncN_selector(HelloWorld::funcN));
CCFiniteTimeAction *a=CCSequence::actions(move,fn,NULL);
s->runAction(a);
回調函數是
void HelloWorld::funcN(CCNode *pSender)
{
CCLog("funcN");
CCSprite *s=(CCSprite*)pSender;
CCLog("x=%f,y=%f",s->getPosition().x,s->getPosition().y);
}
通過測試,傳遞進來的pSender其實是運行該函數的精靈的指針。
CCCallFuncND
在調用這個函數的時候,可以傳遞一個void*的參數
如下使用:
CCSprite *s=CCSprite::create("sprite.png");
s->setPosition(ccp(0,0));
addChild(s);
CCActionInterval *move=CCMoveBy::create(3,ccp(450,290));
CCFiniteTimeAction *fn=CCCallFuncND::actionWithTarget(this,callfuncND_selector(HelloWorld::funcN),(void*)7);
CCFiniteTimeAction *a=CCSequence::actions(move,fn,NULL);
s->runAction(a);
回調函數是:
void HelloWorld::funcN(CCNode *pSender,void* data)
{
CCLog("funcN");
CCSprite *s=(CCSprite*)pSender;
CCLog("x=%f,y=%f,*data=%d",s->getPosition().x,s->getPosition().y,int(data));
}
這樣可以獲得傳遞過來的數據。
CCCallFuncO
這個函數與CCCallFuncN差不多,只不過回調函數的參數是CCObject*類型。