【Cocos2d-x遊戲引擎開發筆記(4)】系統動畫

原創文章,轉載請註明出處:http://blog.csdn.net/zhy_cheng/article/details/8271154

Cocos2d-x提供的動畫主要是瞬時動畫和延時動畫。

瞬時動作就是不需要時間,馬上就完成的動作。瞬時動作的共同基類是CCActionInstant。

延時動作就是指動作的完成需要一段時間。因此,幾乎所有的延時動作都使用執行時間作爲第一個參數,它們有着共同的基類CCActionInterval。


1.瞬時動畫


我實現x翻轉和y翻轉
原圖
使用下面的代碼實現x和y翻轉
		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);

上面的代碼一次執行。

CCSpawn
要求動作本身是可以同時執行的,比如:移動式翻轉、變色、縮放等。需要特別注意的是,同步執行最後完成的時間由基本動作中用時最大者決定。
		CCActionInterval *ac=CCRotateBy::actionWithDuration(2,270);
		CCActionInterval *sc=CCScaleBy::actionWithDuration(2,2,2);
		CCFiniteTimeAction *se=CCSpawn::actions(ac,sc,NULL);

		s->runAction(se);

上面的動畫同時執行。

CCRepeat
CCRepeat用來將某一動作重複有限次數
		CCActionInterval *sc=CCScaleBy::actionWithDuration(2,2,2);
		CCFiniteTimeAction *se=CCSpawn::actions(ac,sc,NULL);
		CCActionInterval *rc=CCRepeat::actionWithAction(se,4);

上面的代碼執行四次

Reverse
動作就是反向(逆向)執行某個動作,支持針對動作序列的反動作序列。反動作不是一個專門的類,而是CCFiniteTimeAction引入的一個接口。不是所有的類都支持反動作,CCXxxxTo類通常不支持反動作,而CCXxxxBy類通常支持,示例如下:
		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);

上面的動畫將還原。

CCDelayTime
通過CCDelayTime,我們可以在動作序列中增加一個時間間歇。
		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);


CCCallFunc
在運行過程中還可以增加函數調用
函數無返回值,無參數
		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*類型。





發佈了152 篇原創文章 · 獲贊 621 · 訪問量 120萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章