游戲開發(fā)平臺Cocos2Dx中的動作特效與動畫課件_第1頁
游戲開發(fā)平臺Cocos2Dx中的動作特效與動畫課件_第2頁
游戲開發(fā)平臺Cocos2Dx中的動作特效與動畫課件_第3頁
游戲開發(fā)平臺Cocos2Dx中的動作特效與動畫課件_第4頁
游戲開發(fā)平臺Cocos2Dx中的動作特效與動畫課件_第5頁
已閱讀5頁,還剩81頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

游戲開發(fā)平臺Cocos2D-xocos2d-X中的動作特效與動畫2019/3/8xxxxxxxxxx1游戲開發(fā)平臺Cocos2D-xocos2d-X中的動作特效與2019/3/8xxxxxxxxxx2

Cocos2D-x的基礎類,包括節(jié)點類CCNode、導演類CCDirector、場景類CCScene、布景層、CCLayer和精靈類CCSprite等。這些類都是構成游戲畫面的基本元素。 但是游戲不僅是由靜態(tài)畫面構成的,更多時候,游戲是動態(tài)效果的呈現(xiàn),所以動作、特效和動畫是游戲區(qū)別于應用的特點,又是決定游戲質量的關鍵一環(huán)。 因此,決定一個二維游戲引擎的好壞的重要因素是引擎對動作、特效和動畫的支持程度。2019/3/8xxxxxxxxxx2 Cocos2D-x的動作類2019/3/8xxxxxxxxxx3Cocos2D-x的動作類CCAction并不是一個在屏幕中顯示的對象,動作必須要依托于CCNode類及它的子類的實例才能發(fā)揮作用。C0C0S2D-x的動作包括位置移動、跳躍,甚至是對象顏色的漸變。CCAction類繼承于對象類CCObject,有三個子類:有限時間動作、跟隨、移動速度,其中有限時間動作分為瞬時動作(CCActionlnstant)和延時動作(CCActionlnterval)。動作類2019/3/8xxxxxxxxxx3Cocos2D-CCAction的主要函數(shù)2019/3/8xxxxxxxxxx4CCAction的主要函數(shù)2019/3/8xxxxxxxx2019/3/8xxxxxxxxxx5CCAction的子類CCFiniteTimeAction分為瞬時動作(CCActionlnstant)和延時動作bCCActionlnterval)2019/3/8xxxxxxxxxx5CCAction的子類移動動作2019/3/8xxxxxxxxxx6VoidActionMove::onEnter(){ActionsDemo::onEnter();centerSprites(3);CCSizes=CCDirector::sharedDirector()->getWinSize();CCActionlnterval*actionTo=CCMoveTo::create(2,CCPointMake(s.width-40,s.height-40));CCActionlnterval*actionBy=CCMoveBy::create(2,CCPointMake(80,80));CCActionlnterval*actionByBack=actionBy->reverse;);_tamara->runAction(actionTo);_grossini->runAction(CCSequence::create(actionBy,actionByBack,NULL));_kathia->runAction(CCMoveTo::create(1,CCPointMake(40,40)));}以上分別定義了CCMoveTo和CCMoveBy的實例。之前已經(jīng)說過CCMoveBy是MoveTo的子類,CCMoveTo是移動到目標位置,而CCMoveB>.是次目前位置的基礎上移之到目標位置。 創(chuàng)建函數(shù)create的第一個參數(shù)是時間,第二個參數(shù)是位置對象。動作調(diào)用reverse函數(shù)會返回另外一個動作,使這個動作倒置,而精靈類實例在調(diào)用runAction函數(shù)時也會有不同,m_grossini精靈使用的就是動作序列CCSequence。CCSequence動作序列的定義由多個動作構成,create函數(shù)中以NULL參數(shù)作結尾,效果是作為參數(shù)傳入的動作會頤序執(zhí)行。移動動作2019/3/8xxxxxxxxxx6VoidA縮放動作2019/3/8xxxxxxxxxx7VoidActionScale::onEnter(){ActionsDemo::onEnter();centerSprites(3);CCActionlnterval*actionTo=CCScaleTo::create(2.Of,0.5f);CCActionlnterval*actionBy=CCScaleBy::create(2.Of/l.Of,lO.Of);CCActionlnterval*actionBy2=CCScaleBy::create(2.Of,5.Of,l.Of};m_grossini->runAction(actionTo);m_tamara->runAction(CCSequence::create(actionBy,actionBy->reverse(),NULL));m_kathia->runAction(CCSequence::create(actionBy2,actionBy2->reverse(),NULL));}以上分別定義了CCScaleTo和CCScaleBy的實例。之前已經(jīng)說過CCScaleBy是CCScaleTo的子類,CCScaleTo是縮放到相應比例,CCScaleBy是在目前基礎上變化相應的縮放比例。create函數(shù)可以使用兩個參數(shù)或者三個參數(shù)。兩個參數(shù)的第一個參數(shù)是時間間隔,第二個參數(shù)是縮放比例。三個參數(shù)的第一個參數(shù)是時間間隔,第二個參數(shù)是x軸縮放比例,第三個參數(shù)是y軸縮放比例??s放動作2019/3/8xxxxxxxxxx7VoidAc扭曲動作2019/3/8xxxxxxxxxx8VoidActionSkew::onEnter(){ActionsDemo::onEnter();centerSprites(3);CCActionlnterval*actionTo=CCSkewTo::create(2,37.2f,-37.2f);CCActionlnterval*actionToBack=CCSkewTo::create(2,0,0);CCActionlnterval*actionBy=CCSkewBy::create(2,O.Of,-90.Of);CCActionlnterval*actionBy2=CCSkewBy::create(2,45.Of,45.0f);CCActionlnterval*actionByBack=actionBy->reverse();m_tamara->runAction(CCSequence::create(actionTo,actionToBack,NULL));M_grossini->runAction(CCSequence::create(actionBy,actionByBack,NULL));m_kathia->runAction(CCSequence::create(actionBy2,actionBy2->reverse(),NULL));}以上分別定義了CCSkewTo和CCSkewBy是實例。之前已經(jīng)說過CCSkewBy是CCSkewTo的子類。二者關系和之前類似,以By結尾的參數(shù)是相對于目前值的過程量,以To結尾的參數(shù)是絕對的參數(shù),不管現(xiàn)有狀態(tài)如何,直接設置為參數(shù)的這個值。三個參數(shù)的第一個參數(shù)是時間間隔,第二個參數(shù)是x軸扭曲參數(shù),第三個參數(shù)是y軸扭曲參數(shù)。扭曲動作2019/3/8xxxxxxxxxx8VoidAc旋轉動作2019/3/8xxxxxxxxxx9voidActionRotate::onEnter(){ActionsDemo::onEnter();centerSprites(3);CCActionlnterval*actionTo=CCRotateTo::create(2,45);CCActionlnterval*actionTo2=CCRotateTo::create(2,-45);CCActionlnterval*actionToO=CCRotateTo::create(2,0);m_tamara->runAction(CCSequence::create(actionTo,actionToO,NULL));CCActionlnterval*actionBy=CCRotateBy::create(2,360);CCActionlnterval*actionByBack=actionBy->reverse();M_grossini->runAction(CCSequence::create(actionBy,actionByBack,NULL));m_kathia->runAction(CCSequence::create(actionTo2,actionToO->copy()->autorelease(),NULL));以上分別定義了CCRotateTo和CCRotateBy的實例。之前已經(jīng)說過CCRotateBy是CCRotateTo的子類,二者關系和之前類似。兩個參數(shù)的第一個參數(shù)是時間間隔,第二個參數(shù)是旋轉角度,這里的角度表示采用角度制。旋轉動作2019/3/8xxxxxxxxxx9voidAct跳轉動作2019/3/8xxxxxxxxxx10voidActionJump::onEnter()ActionsDemo::onEnter();centerSprites(3);CCActionlnterval*actionTo=CCJumpTo::create(2,CCPointMake(300,300),50,4);CCActionlnterval*actionBy=CCJumpBy::create(2,CCPointMake(300,0),50,4);CCActionlnterval*actionUp=CCJumpBy::create(2,CCPointMake(0,0),80,4);CCActionlnterval*actionByBack=actionBy->reverse();m_tamara->runAction(actionTo);m_grossini->runAction(CCSequence::create(actionBy,actionByBack,NULL));m_kathia->runAction(CCRepeatForever::create(actionUp));以上分別定義了CCJumpTo和CCJumpBy的實例。之前已經(jīng)說過CCJumpTo是CCJumpBy的子類,二者關系和之前類似。四個參數(shù)的第一個參數(shù)是時間間隔,第二個參數(shù)CCJumpTo的是目標位置的絕對坐標,CCJumpBy的是相對于目前位置的相對坐標,第三個參數(shù)為跳躍高度,第四個參數(shù)是跳躍的次數(shù)。跳轉動作2019/3/8xxxxxxxxxx10voidAc貝塞爾曲線動作2019/3/8xxxxxxxxxx11voidActionBezier::onEnter()ActionsDemo::onEnter();CCSizes=CCDirector::sharedDirector()->getWinSize();centerSprites(3);ccBezierConfigbezier;bezier.controlPoint_l=CCPointMake(0,s.height/2);bezier.controlPoint_2=CCPointMake(300,-s.height/2);bezier.endPosition=CCPointMake(300,100);CCActionlnterval*bezierForward=CCBezierBy::create(3,bezier);CCActionlnterval*bezierBack=bezierForward->reverse();CCAction*rep=CCRepeatForever::create((CCActionlnterval*)CCSequence::create(bezierForward,bezierBack,NULL));m_tamara->setPosition(CCPointMake(80,160));ccBezierConfigbezier2;bezier2.controlPoint_1=CCPointMake(100,s.height/2);bezier2.controlPoint_2=CCPointMake(200,-s.height/2);bezier2.endPosition=CCPointMake(240,160);CCActionlnterval*bezierTol=CCBezierTo::create(2,bezier2);m_kathia->setPosition(CCPointMake(400,160));CCActionlnterval*bezierTo2=CCBezierTo::create{2,bezier2);m_grossini->runAction(rep);m_tamara->runAction(bezierTo1);m__kathia->runAction(bezierTo2);貝塞爾曲線動作2019/3/8xxxxxxxxxx11voi2019/3/8xxxxxxxxxx12

ccBezierConfig的三個參數(shù)需要配置,前兩個是控制點,最后一個是終點。其中終點在CCBezierTo和CCBezierBy兩個類中的運行結果不同,依然是CCBezierTo的終點是絕對位置,而CCBezierBy是相對于目前位置的相對位置??刂泣c的設置分別控制在路徑上的高峰和低谷的位置。如果走的路徑與圖中方向一致,苧兩個控制點的縱坐標設置為一正一負??刂泣c縱坐標的正負決定是向下走還是向上絕對值決定移動的幅度。而橫坐標是橫坐標方向的移動,該值對于CCBezierBy是相對于目前位置的相對位置,于CCBezierTo的終點是絕對位置。如果需要圖中曲線旋轉90度的路徑,就把兩個控制點的橫坐標分別設置為一正一負即可,然后交換x軸和y軸的要求

CCBezierTo和CCBezierBy都是貝塞爾曲線動作。create函數(shù)沒有什么區(qū)別,都是兩個參數(shù),第一個參數(shù)依然是動作時間,第二個參數(shù)是貝塞爾曲線的配置系數(shù)。.貝塞爾曲線是應用于二維圖形應用程序的數(shù)學曲線,每一個頂點都有兩個控制點,用于控制該頂點兩側曲線的弧度2019/3/8xxxxxxxxxx12ccBez淡入淡出動作2019/3/8xxxxxxxxxx13VoidActionFade::onEnter(){ActionsDemo::onEnter();centerSprites(2);m_tamara->setOpacity(0);CCActionlnterval*actionl=CCFadeln::actionWithDuration(l.Of);CCActionlnterval*actionlBack=actionl->reverse();CCActionlnterval*action2=CCFadeOut::actionWithDuration(l.Of);CCActionlnterval*action2Back=action2->reverse();m_tamara->runAction(CCSequence::actions(actionl,actionlBack,NULL));m_kathia->runAction(CCSequence::actions(action2,action2Back/NULL));}std::StringActionFade::subtitle(){return"Fadeln/FadeOut";}這里需要說明的是,淡入首先要將不透明度設置為0。淡入淡出動作2019/3/8xxxxxxxxxx13Void閃爍動作2019/3/8xxxxxxxxxx14voidActionBlink::onEnter() ActionsDemo::onEnter(); centerSprites(2); CCActionlnterval*actionl=CCBlink::actionWithDuration(2,10);CCActionlnterval*action2=CCBlink::actionWithDuration(2,5);m_tamara->runAction(actionl); m_kathia->runAction(action2); }閃爍動作2019/3/8xxxxxxxxxx14voidAc色值漸變動作2019/3/8xxxxxxxxxx15voidActionTint::onEnter(){ActionsDemo::onEnter();centerSprites(2);CCActionlnterval*actionl=CCTintTo::actionWithDuration(2,255,0,255);CCActionlnterval*action2=CCTintBy::actionWithDuration(2,-127,-255,-127);CCActionlnterval*action2Back=action2->reverse();?m_tamara->runAction(actionl);m__kathia->runAction(CCSequence::actions(action2,action2Back/NULL))}以上分別定義了CCTintTo和CCTintBy的實例,第一個參數(shù)是動作時間,后三個參數(shù)分別是顏色的R、G、B值。CCTintTo是直接設置色值,CCTintBy是在目前值上加上相應的值。色值漸變動作2019/3/8xxxxxxxxxx15void攝像機動作類2019/3/8xxxxxxxxxx16第3章介紹了攝像機類CCCamera,動作中也有一個攝像機動作類CCOrbitCamera,它是攝像機環(huán)繞屏幕中心旋轉所形成的動作。voidActionOrbit::onEnter(){ActionsDemo::onEnter();centerSprites(3);CCActionlnterval*orbit3=CCOrbitCamera::create(2,1,0,0,180,90,0);CCFiniteTimeAction*action3=CCSequence::create(orbit3,orbit3->reverse(),NULL);m_kathia->runAction(CCRepeatForever::create((CCActionlnterval*)actionl));m_tamara->runAction(CCRepeatForever::create((CCActionlnterval*)action2));m_grossini->runAction(CCRepeatForever::create((CCActionlnterval*)action3));CCActionlnterval*move=CCMoveBy::create(3,CCPointMake(100,-100));CCActionlnterval*move_back=move->reverse();CCFiniteTimeAction*seq=CCSequence::create(move,move_back,NULL);CCAction*rfe=CCRepeatForever::create((CCActionlnterval*)seq);m_kathia->runAction(rfe);m_tamara->runAction((CCAction*)(rfe->copy()->autorelease()));m_grossini->runAction((CCAction*)(rfe->copy()->autorelease()));}攝像機動作類2019/3/8xxxxxxxxxx16第3章介攝像機動作類2019/3/8xxxxxxxxxx17旋轉的坐標描述采用了球坐標。球坐標采用球面半徑、與X軸夾角、與Z軸夾角這幾個值來描述坐標點。攝像機動作類CCOrbitCamera的創(chuàng)建函數(shù)create有7個參數(shù),第一個參數(shù)是動作時間,第二、三個參數(shù)是起始的坐標值中的半徑和過程中的坐標值中的半徑,第四、五個參數(shù)是起始的坐標值中的與z軸夾角和過程中的坐標值中的與z軸夾角,第六、七個參數(shù)是起始的坐標值中的與x軸夾角和過程中的坐標值中的與x軸夾角。注意在使用攝像機旋轉時,如果正在旋轉的這個節(jié)點后面還有其他節(jié)點的話,可能會出現(xiàn)旋轉的節(jié)點只有一部分顯示出來的這種情況。這時只需要關閉OpenGL的深度檢測,獲得導演類并調(diào)用setDepthTest設置為false即可,如下面的代碼所示:CCDirector::sharedDirector()->setDepthTest(false)。攝像機動作類2019/3/8xxxxxxxxxx17基本樣條動作2019/3/8xxxxxxxxxx18在游戲中,有時會希望使用一些非常規(guī)軌跡能描述的運動軌跡,希望只是“告訴”游戲對象幾個離散的點,游戲對象就可以根據(jù)這些離散的點模擬出相應的路徑。當然,有相應的公式模擬出這條曲線,那就是基本樣條。Cocos2D-x中有沿基本樣條路徑移動動作類CCCardinalSplineTo和其子類實現(xiàn)這樣的功能其中CCCardinalSplineTo和CCCardinalSplineBy的關系與之前以“To”和“By”結尾的類類似,CCCatmullRomTo和CCCatmullRomBy也是這樣的。它們都是采用基本樣條的公式;不同的是,CCCatmullRomTo和CCCatmullRomBy的拉力系數(shù)是0.5,而之前的CCCardinalSplineTo和CCCardinalSplineBy的拉力系數(shù)是可以自定義的?;緲訔l動作2019/3/8xxxxxxxxxx18在游戲中畫基本樣條路徑2019/3/8xxxxxxxxxx19VoidActionCardinalSpline::onEnter(){ActionsDemo::onEnter();this->centerSprites(2);CCSizes=CCDirector::sharedDirector()->getWinSize();CCPointArray*array=CCPointArray::create(20);array->addControlPoint(ccp(0,0));array->addControlPoint(ccp(s.width/2-30,0));array->addControlPoint(ccp(s.width/2-30,s.height-80));array->addControlPoint(ccp(0,s.height-80));array->addControlPoint(ccp(0,0));CCCardinalSplineBy*action=CCCardinalSplineBy::create(3,array,0);CCActionlnterval*reverse=action->reverse();CCFiniteTimeAction*seq=CCSequence::create(action,reverse,NULL);M_tamara->setPosition(ccp(50,50));M_tamara->runAction(seq);CCCardinalSplineBy*action2=CCCardinalSplineBy::create(3,array,1);CCActionlnterval*reverse2=action2->reverse();CCFiniteTimeAction*seq2=CCSequence::create(action2,reverse2,NULL);m_kathia->setPosition(ccp(s.width/2,50));m_kathia->runAction(seq2);M_pArray=array;array->retain();}首先定義一個點數(shù)組,把路徑的點放入點數(shù)組中。創(chuàng)建基本樣條動作時,3個參數(shù)分別是動作時間、點數(shù)組、拉力系數(shù)。

CCCardinalSplineTo和CCCardinalSplineBy的區(qū)別是,由于第一個是絕對的,第二個是相對的,第二個定義點數(shù)組的時候,第一個點最好設置為(0,0),否則起始點會被忽略掉。可以重寫布景層的draw函數(shù)來把路徑畫出來。畫基本樣條路徑2019/3/8xxxxxxxxxx19Voi畫Catmull-Rom樣條路徑2019/3/8xxxxxxxxxx20voidActionCatmullRom::onEnter(){ActionsDemo::onEnter();this->centerSprites(2);CCSizes=CCDirector::sharedDirector()->getWinSize();m_tamara->setPosition(ccp(50,50));CCPointArray*array=CCPointArray::create(20);array->addControlPoint(ccp(0,0));array->addControlPoint(ccp(80,80));array->addControlPoint(ccp(s.width-80,80));array->addControlPoint(ccp(s.width-80,s.height-80));array->addControlPoint(ccp(80,s.height-80));array->addControlPoint(ccp(80,80));array->addControlPoint(ccp(s.width/2,s.height/2));CCCatmullRomBy*action=CCCatmullRomBy::create(3,array);CCFiniteTimeAction*reverse=action->reverse();CCFiniteTimeAction*seq=CCSequence::create(action,reverse,NULL);m_tamara->runAction(seq);CCPointArray*array2=CCPointArray:create(20);array2->addControlPoint(ccp(s.width/2,30));array2->addControlPoint(ccp(s.width-80,30));array2->addControlPoint(ccp(s.width-80,s.height-80));array2->addControlPoint(ccp(s.width/2,s.height-80));array2->addControlPoint(ccp(s.width/2,30));CCCatmullRomTo*action2=CCCatmullRomTo::create(3,array2);CCFiniteTimeAction*reverse2=action2->reverse();CCFiniteTimeAction*seq2=CCSequence::create(action2,reverse2,NULL);m_kathia->runAction(seq2);m__pArrayl=array;m_pArrayl->retain();m_pArray2=array2;m_pArray2->retain();CCCatmullRomTo和CCCatmullRomBy的用法和之前的那組類的用法一樣,只是不需要第三個拉力系數(shù)參數(shù)。它們的區(qū)別和之前的也是一樣的,也可以重寫布景層的draw函數(shù)來把路徑畫出來。畫Catmull-Rom樣條路徑2019/3/8xxxxxx緩沖動作2019/3/8xxxxxxxxxx21在實現(xiàn)運動中,常常需要實現(xiàn)一些加速度或者減速度的效果。Cocos2D-x引擎為我們提供了相應的實現(xiàn)接口,這樣就不用再用原來的公式計算方法來實現(xiàn)加減速度的效果。Ease系列的方法改變了運動的速度,但是并沒有改變總體時間。如果整個動作持續(xù)5s,那么整個時間仍然會持續(xù)5s。這些動作可以分成三類?!鮅nactions:action(開始的時候加速)?□Outactions:action(結束的時候加速)□InOutactions:action(開始和結束的時候加速)CCActionEase有很多子類,根據(jù)不同的緩沖公式來模擬加減速過程。緩沖動作的具體內(nèi)容如下。1)指數(shù)緩沖:分別為EaseExponentialln、EaseExponentialOut、EaseExponentiallnOut。2)賽因緩沖:分別為EaseSineIn、EaseSineOut、EaseSineInOut。3)跳躍緩沖:分別為EaseBounceln、EaseBounceOut、EaseBouncelnOut。4)彈性緩沖:分別為EaseElasticIn、EaseElasticOut、EaseElasticInOut。5)回震緩沖:分別為EaseBackln、EaseBackOut、EaseBacklnOut。以上介紹的5種緩沖,加上基本的緩沖動作,一共6種緩沖動作,其定義如代碼清單4-15所示。緩沖動作2019/3/8xxxxxxxxxx21在實現(xiàn)運動中緩沖動作2019/3/8xxxxxxxxxx22//基本緩沖動作CCEaseln::create((CCActionlnterval*)(move->copy()->autorelease()),2.5f);CCEaseOut::create((CCActionlnterval*)(move->copy()->autorelease()),2.5f);CCEaselnOut::create((CCActionlnterval*)(move->copy()->autorelease()),0.65f);//指數(shù)緩沖動作CCEaseExponentialln::create((CCActionlnterval*)(move->copy()->autorelease()));CCEaseExponentialOut::create((CCActionlnterval*)(move->copy()->autorelease()));CCEaseExponentiallnOut::create((CCActionlnterval*)(move->copy()->autorelease()));//賽因緩沖動作CCEaseSineln::create((CCActionlnterval*)(move->copy()->autorelease()));CCEaseSineOut::create((CCActionlnterval*)(move->copy()->autorelease()));CCEaseSinelnOut::create((CCActionlnterval*)(move->copy()->autorelease()));緩沖動作2019/3/8xxxxxxxxxx22//基本緩沖緩沖動作2019/3/8xxxxxxxxxx23//跳躍緩沖動作CCEaseBounceln::create((CCActionlnterval*)(move->copy()->autorelease()));CCEaseBounceOut::create((CCActionlnterval*)(move->copy()->autorelease()));CCEaseBouncelnOut::create((CCActionlnterval*)(move->copy()->autorelease()));//彈性緩沖動作CCEaseElasticIn::create((CCActionlnterval*)(move->copy()->autorelease()));CCEaseElasticOut::create((CCActionlnterval*)(move->copy()->autorelease()));CCEaseElasticInOut::create((CCActionlnterval*)(move->copy()->autorelease()),0.3f);//緩沖動作CCEaseBackln::create((CCActionlnterval*)(move->copy()->autorelease()));CCEaseBackOut::create((CCActionlnterval*)(move->copy()->autorelease()));CCEaseBacklnOut::create((CCActionlnterval*)(move->copy()->autorelease()));第一個參數(shù)是要緩沖的動作,其中基本緩沖動作需要第二個參數(shù)是速率,彈性緩沖動作需要第二個參數(shù)是震動的周期,默認值為0.3。緩沖動作2019/3/8xxxxxxxxxx23//跳躍緩沖組合動作2019/3/8xxxxxxxxxx24在游戲中,游戲對象有時不是執(zhí)行一個動作,有時是多個動作的動作序列,有時是同時執(zhí)行幾個動作序列。這時候就需要使用組合動作的方式將多個動作或按序列組織,或合成在一起。1.CCSequence

定義一個動作序列,可以使用動作的CCArray數(shù)組;也可以把所有的動作作為參數(shù)傳入create函數(shù)中,最后結尾參數(shù)使用NULL(空值)即可;還可以把兩個有限時間動作按順序傳人create函數(shù)中。CCFiniteTimeAction*seq2=CCSequence::create(action2#reverse2,NULL);m_kathia->runAction(seq2);2.CCSpawn CCSpawn動作是使被合成的動作同時進行。它的定義方法和動作序列一致CCAction*action=CCSpawn::create(CCJumpBy::create(2,CCPointMake(300,0),50,4),CCRotateBy::create(2,720),NULL);m_grossini->runAction(action);組合動作2019/3/8xxxxxxxxxx24在游戲中,游組合動作2019/3/8xxxxxxxxxx253.CCRepeat和CCRepeatForever

除了以上兩個可以實現(xiàn)多個動作的類外,還有可以使一個動作重復播放的類,那就是CCRepeat和CCRepeatForever。二者都可以使動作重復進行,不同之處就是CCRepeat可以在第二個參數(shù)中定義重復次數(shù),而CCRepeatForever是一直重復的。CCActionInterval*rep2=CCRepeat::create((CCFiniteTimeAction*)(seq->copy()->autorelease()),10);m_kathia->runAction(rep2);CCAction*rep2=CCRepeatForever::create((CCActionlnterval*)(seq->copy()->autorelease()));m_kathia->runAction(rep2);組合動作2019/3/8xxxxxxxxxx253.CCRe跟隨動作2019/3/8xxxxxxxxxx26跟隨動作CCFollow是一個節(jié)點跟隨另外一個節(jié)點的動作。voidActionFollow::onEnter(){ActionsDemo::onEnter();centerSprites(1);CCSizes=CCDirector::sharedDirector()->getWinSize();m_grossini->setPosition(CCPointMake(-200,s.height/2));CCActionlnterval*move=CCMoveBy::create(2,CCPointMake(s.width*3,0));CCActionlnterval*move_back=move->reverse();CCFiniteTimeAction*seq =CCSequence::create(move,move_back,null);CCAction*rep =CCRepeatForever::create((CCActionlnterval*)seq);m_grossini->runAction(rep);this->runAction(CCFollow::create(m_grossinifCCRectMake(0,0,s.width*2-100,s.height)));}跟隨動作2019/3/8xxxxxxxxxx26跟隨動作CC可調(diào)整動作速度2019/3/8xxxxxxxxxx27可調(diào)整速度動作CCSpeed不是一個獨立的動作,可以把它理解為是對目前動作的一個“包裝”,經(jīng)過這個“包裝”以后,就可以實現(xiàn)“慢動作”和“快進”的效果。使用CCSpeed來處理很方便VoidSpeedTest::onEnter(){EaseSpriteDemo::onEnter();CCSizes=CCDirector::sharedDirector()->getWinSize();CCActionlnterval*junpl=CCJunpBy::create(4#CCPointMake(-s.width+80,0),100,4);CCActionlnterval*jump2=jumpl->reverse();CCActionlnterval*rotl=CCRotateBy::create(4,360*2);CCActionlnterval*rot2=rotl->reverse();CCFiniteTimeAction*seq3_l=CCSequence::create(jump2,jumpl,NULL);CCFiniteTimeAction*seq3_2=CCSequence::create(rotl,rot2,NULL);CCFiniteTimeAction*spawn=CCSpawn::create(seq3_1,seq3_2,NULL);CCSpeed*action=CCSpeed::create(CCRepeatForever::create((CCActionlnterva1*)spawn).1.Of);action->setTag(kTagActionl);CCAction*action2=(CCAction*)(action->copy()->autorelease());CCAction*action3=(CCAction*)(action->copy()->autorelease());action2->setTag(kTagActionl);action3->setTag(kTagActionl);m_grossini->runAction(action2);m_tamara->runAction(action3);m_kathia->runAction(action);this->schedule(schedule_selector(SpeedTest::altertime),1.Of);}voidSpeedTest::altertime(floatdt){CCSpeed*actionl=(CCSpeed*)(m_grossini->getActionByTag(kTagActionl))CCSpeed*action2=(CCSpeed*)(m_tamara->getActionByTag(kTagActionl));CCSpeed*action3=(CCSpeed*)(m_kathia->getActionByTag(kTagActionl));actionl->setSpeed(CCRAND0M_0_1()*2);action2->setSpeed(CCRAND0M_0_1()*2);action3->setSpeed(CCRAND0M_0_1()*2);}在onEnter函數(shù)中,就是定義普通動作,并使用schedule,使得每1.0s調(diào)用altertime函數(shù)。在altertime函數(shù)中,通過getActionByTag獲得動作,把它們視作CCSpeed,并使用setSpeed設置速度:設置1,是原速度;大于1,速度加快,小于1,速度減慢??烧{(diào)整動作速度2019/3/8xxxxxxxxxx27可調(diào)整2019/3/8xxxxxxxxxx28動作延時CCDelayTime就是動作延后一段固定的時間,可以把它理解為一個“空動作”,只有時間,沒有任何動作。voidActionDelayTime::onEnter(){ActionsDemo::onEnter();alignSpritesLeft(1);CCActionlnterval*move=CCMoveBy::create(1,CCPointMake(150,0));CCFiniteTimeAction*action=CCSequence::create(move,CCDelayTime::create(2),move,NULL);m_grossini->runAction(action);}2019/3/8xxxxxxxxxx28動作延時CCDela改變動作執(zhí)行對象2019/3/8xxxxxxxxxx29CCTargetedAction類可以改變動作的執(zhí)行對象。一般默認的動作執(zhí)行對象是調(diào)用mnAction的對象:有時候要自定義動作執(zhí)行對象,這時候需要使用CCTargetedAction。VoidActionTargeted::onEnter(){ActionsDemo::onEnter();centerSprites(2);CCJumpBy*jumpl=CCJumpBy::create(2,CCPointZero,100,3);CCJumpBy*jump2=(CCJumpBy*)jumpl->copy()->autorelease();CCRotateBy*rotl=CCRotateBy::create(1,360);CCRotateBy*rot2=(CCRotateBy*)rotl->copy()->autorelease0;CCTargetedAction*tl=CCTargetedAction::create(m_cathia,jump2);CCTargetedAction*t2=CCTargetedAction::create(m_cathia,rot2);CCSequence*seq=(CCSequence*)CCSequence::create(junpl,tl,rotl,t2,NULL);CCRepeatForever*always=CCRepeatForever::create(seq);m_tamara->runAction(a1ways);}它的定義使用create函數(shù),第一個參數(shù)是執(zhí)行動作的節(jié)點,第二個參數(shù)是須執(zhí)行的動作。這樣一來,雖然調(diào)用runAction的是m_tamara,但是執(zhí)行到tl和t2時,執(zhí)行動作的節(jié)點變?yōu)榱薽_kathia。改變動作執(zhí)行對象2019/3/8xxxxxxxxxx29CC函數(shù)回調(diào)動作2019/3/8xxxxxxxxxx30有時候某些動作完成后,需要執(zhí)行一些數(shù)據(jù)上的處理,比如攻擊一個敵人,需要處理加減血等。其中CCCallFunc就是回調(diào)函數(shù),該回調(diào)的函數(shù)不含參數(shù)。CCCallFunc的回調(diào)函數(shù)以CCNode對象和數(shù)據(jù)作為參數(shù)。“N”就是“Node”的意思;“D”就是“Data”的意思,數(shù)據(jù)可以是任何類型的。CCCallFuncO是以CCObject作為回調(diào)函數(shù)參數(shù)的,“0”就是“Object”的意思。voidActionSequence2::onEnter(){ActionsDemo::onEnter()alignSpritesLeft(1);m_grossini->setVisible(false);CCFiniteTimeAction*action=CCSequence::create(CCPlace::create(CCPointMake(200,200)),CCShow::create(),CCMoveBy::create(1,CCPointMake(100,0)),CCCallFunc::create(this,callfunc_selector(ActionSequence2::callbackl)),CCCallFuncN::create(this,califuncN_selector(ActionSequence2::callback2)),CCCallFuncND::create(this.callfuncNDselector(ActionSequence2::callback3),(void*)Oxbebabeba),NULL);m_grossini->runAction(action);}函數(shù)回調(diào)動作2019/3/8xxxxxxxxxx30有時候某函數(shù)回調(diào)動作2019/3/8xxxxxxxxxx31voidActionSequence2::callbackl(){CCSizes=CCDirector::sharedDirector()->getWinSize();CCLabelTTF*label=CCLabelTTF::create("callback1called","MarkerFelt",16);label->setPosition(CCPointMake(s.width/4*l,s.height/2));addChild(label);}voidActionSequence2::callback2(CCNode*sender){CCSizes=CCDirector::sharedDirector()->getWinSize();CCLabelTTF*label=CCLabelTTF::create(11callback2called","MarkerFelt",16);label->setPosition(CCPointMake(s.width/4*2,s.height/2));addChild(label);}voidActionSequence2::callback3(CCNode*sender,void*data){CCSizes=CCDirector::sharedDirector()->getWinSize();CCLabelTTF*label=CCLabelTTF::create("callback3called","MarkerFelt",16);label->setPosition(CCPointMake(s.width/4*3.s.height/2));addChild(label);}可以看到CCCallFunc、CCCallFuncN和CCCallFuncND的定義,第一個參數(shù)就是擁有回調(diào)函數(shù)的對象,第二個參數(shù)通過相應選擇器獲得函數(shù)名稱,CCCallFuncND的最后一個參數(shù)就是數(shù)據(jù)對象,底下分別是三個函數(shù)的定義。函數(shù)回調(diào)動作2019/3/8xxxxxxxxxx31可以看到過程動作2019/3/8xxxxxxxxxx32很多時候,在進入游戲之前都需要載人動作,這時候需要一些動作用來實現(xiàn)載入時的動畫。Cocos2D-x提供了CCProgressTo和CCProgressFromTo來實現(xiàn)這個動畫,但是執(zhí)行這種動作的節(jié)點是CCProgressTimer。voidSpriteProgressToRadial:ronEnter(){SpriteDemo::onEnter();CCSizes=CCDirector::sharedDirector()->getWinSize();CCProgressTo*tol=CCProgressTo::create(2,100);CCProgressTo*to2=CCProgressTocreate(2,100);CCProgressTimer*left=CCProgressTimer::create(CCSprite::create(s_pPathSisterl));left->setType(kCCProgressTimerTypeRadial);addChild(left);left->setPosition:(CCPointMake(100,s.height/2));left->runAction(CCRepeatForever::create(tol));CCProgressTimer*right=CCProgressTimer::create(CCSprite::create(s_pPathBlock));right->setType(kCCProgressTimerTypeRadial);right->setReverseProgress(true);addChild(right);right->setPosition(CCPointMake(s.width-100,s.height/2));right->runAction(CCRepeatForever::create(to2));}首先是定義CCProgressTo或CCProgressFromTo。第一個參數(shù)都是動作時間;CCProgressTo的第二個參數(shù)是結束時圖片顯示的百分比,CCProgressFromTo的第二個參數(shù)是開始時圖片顯不的百分比;CCProgressFromTo的第三個參數(shù)是結束時圖片顯示的百分比。

接下來是定義CCProgressTimer,傳人精靈對象來定義,通過調(diào)用setType函數(shù)來設置動畫的類型:kCCProgressTimerTypeRadial是圓形掃描的動畫,kCCProgressTimerTypeBar是直線掃描的動畫。調(diào)用setReverseProgress函數(shù)設置正反的方向。kCCProgressTimerTypeBar類型的通過setBarChangeRate設置水平和豎直的變化量。

通過調(diào)用setxxxxxoint函數(shù)設置開始點,(0,0)為左上,(1,1)為右下,其他點可以用浮點數(shù)來表示。過程動作2019/3/8xxxxxxxxxx32很多時候,在動作管理類2019/3/8xxxxxxxxxx33動作管理類CCActionManager是一個管理所有動作的單例,工作原理是:當CCNode漢行runAction時,該函數(shù)會把動作通過動作管理類的addAction函數(shù)將對象傳遞給JCActionManager的單例,該實例再把這個動作添加到自己的動作序列中。 動作管理單例通過定時刷新自己的update方法,在這個方法中去調(diào)用行為序列中每個動作的step(暫停的行為不會update),這些step方法再根據(jù)自身的完成進度去update或是結東行為。 實際上是由動作管理單例驅動的每個動作去更新自己的邏輯,而runAction方法只是將行為對象添加進CCActionManager的待執(zhí)行隊列。當節(jié)點被清除或是行為結束時,動作管理類會自動將動作從隊列中刪除,不需要程序員的管理。 一般情況下,不需要使用這個單例來管理動作,可以使用CCNode類的stopAction、stopActionByTag和stopAllActions等函數(shù)來管理,但是有兩種情況需要使用CCActionManager類單例:□動作的執(zhí)行者不是同一個節(jié)點?!跣枰獣和?重啟活動時。動作管理類2019/3/8xxxxxxxxxx33動作管理類動作管理類的主要函數(shù)2019/3/8xxxxxxxxxx34動作管理類的主要函數(shù)2019/3/8xxxxxxxxxx342019/3/8xxxxxxxxxx35不要輕易使用動作管理類,除非是不同動作目標和需要暫停/重啟動作。這里的例子就是需要暫停/重啟動作時使用VoidResumeTest::onEnter(){ActionManagerTest::onEnter();CCSizes=CCDirector::sharedDirector()->getWinSize();CCLabelTTF*1=CCLabelTTF::create("Grossinionlyrotate/scalein3seconds","Thonburi",16);addChild(1);l->setPosition(CCPointMake(s.width/2,245));CCSprite*pGrossini=CCSprite::create(s_pPathGrossini);addChild(pGrossini,0,kTagGrossini);pGrossini->setPosition(CCPointMake(s.width/2,s.height/2));pGrossini->runAction(CCScaleBy::create(2,2));CCDirector*pDirector=CCDirector::sharedDirector();pDirector->getActionManager()->pauseTarget(pGrossini);pGrossini->runAction(CCRotateBy::create(2,360));this->schedule(schedule—selector(ResumeTest::resumeGrossini).3.Of);}VoidResumeTest::resumeGrossini(floattime){this->unschedule(schedule—selector(ResumeTest::resumeGrossini));CCNode*pGrossini=getChildByTag(kTagGrossini);CCDirector*pDirector=CCDirector::sharedDirector();pDirector->getActionManager()->resumeTarget(pGrossini);}2019/3/8xxxxxxxxxx35不要輕易使用動作管理網(wǎng)格動作2019/3/8xxxxxxxxxx36網(wǎng)格動作類似于特效,可以實現(xiàn)翻轉、抖動、震蕩、水波紋等效果:基于網(wǎng)格實現(xiàn),首先來認識網(wǎng)格Cocos2D-x中,網(wǎng)格類的基類CCGridBase有兩個子類,即CCGrid3D和CCTiledGrid3D。這兩個類的共同點是,網(wǎng)格的每個子塊都可以分離出來。網(wǎng)格沒有什么直接應用的場合,只要明白CCGrid3D和CCTiledGrid3D,并且網(wǎng)格動作是基于網(wǎng)格的即可。運行網(wǎng)格動作的節(jié)點好像被分成了大小相同的很多矩形,通過這些矩形的動作形成整體動作,這些矩形就好像形成了一個矩陣。16x12的網(wǎng)格將會運行得非???,但是效果并不是非常好。32x24的網(wǎng)格看起來會非常棒,但是在有些時候運行起來不會太快。使用網(wǎng)格之前需要取消OpenGL的深度檢測,調(diào)用如下語句:

CCDirector::sharedDirector()->setDepthTest(false)。網(wǎng)格動作的使用和普通動作一樣,可以使用mnAction來運行動作網(wǎng)格動作2019/3/8xxxxxxxxxx36網(wǎng)格動作類似清除網(wǎng)格2019/3/8xxxxxxxxxx37在使用網(wǎng)格時,網(wǎng)格動作結束后需要把網(wǎng)格清空voidTextLayer::checkAnim(floatdt){CCNode*s2=getChildByTag(kTagBackground);if(s2->number0fRunningActions()==0ScScs2->getGrid()!=NULL)s2->setGrid(NULL);}這段代碼首先獲得父節(jié)點,然后檢測父節(jié)點是否還有動作。如果沒有并且網(wǎng)格不為空,則調(diào)用setGrid函數(shù)并傳入空參數(shù)(NULL)便可清空網(wǎng)格。使用schedule—直檢測調(diào)用該函數(shù)就可以實現(xiàn)清空無動作的節(jié)點網(wǎng)格。清除網(wǎng)格2019/3/8xxxxxxxxxx37在使用網(wǎng)格時動畫2019/3/8xxxxxxxxxx38之前已經(jīng)介紹過一些方法讓你的節(jié)點“動”起來,Cocos2D-x中還有一種動作,就是動畫類CCAnimate。要實現(xiàn)CCAnimate,還需要定義CCAnimation等類。我們來看關于動畫的這些類。CCAnimationCache類是一個單例,用于緩存所有的動畫和動畫幀CCAnimationCache::sharedAnimationCache()->addAnimation(animation,"dance");CCAnimationCache*animCache=CCAnimationCache::sharedAnimationCache();CCAnimation*normal=animCache->animationByName("dance11);首先通過sharedAnimationCache函數(shù)可以獲得動畫緩存CCAnimationCache,通過addAnimation函數(shù)往動畫緩存中加人動畫,并給動畫命名,然后通過動畫緩存調(diào)用animationByName函數(shù)傳人動畫名就可以獲得相應的動畫。動畫2019/3/8xxxxxxxxxx38之前已經(jīng)介紹過一動畫2019/3/8xxxxxxxxxx39和精靈巾貞CCSpriteFrame類似,動畫幀CCAnimationFrame是單張的圖片,也可以通過精靈幀定義。CCSpriteFrame*frame=(CCSpriteFrame*)pObj;CCAnimationFrame*animFrame=newCCAnimationFrame();animFrame->initWithSpriteFrame(frame,1,NULL);這里initWithSpriteFrame函數(shù)就是通過精靈巾貞CCSpriteFrame初始化動園巾貞CCAni-=iationFrame的,第一個參數(shù)是精靈幀CCSpriteFrame,第二個參數(shù)是該動畫幀的延遲時間有時動畫的某一幀需要延遲,使用該參數(shù)定義就可以),最后一個參數(shù)是CCDictionary類型的信息。CCAnimation就是動畫,儲存一個動畫動作需要的所有幀,可以通過幀的數(shù)組定義CCArray*animFrames=CCArray::create();chartmp[50];for(intj=0;j<14;j++){sprintf(tmp,"grossini_dance_%02d.png”,j+1);CCSpriteFrame*frame=cache->spriteFrameByName(tmp);animFrames->addObject(frame);}CCAnimation*animation=CCAnimation::create(animFramesf0.3f);首先定義一個精靈幀CCSpriteFrame的數(shù)組,然后定義一個動畫CCAnimation;也可以隻用動畫巾貞CCAnimationFrame來定義。動畫2019/3/8xxxxxxxxxx39和精靈巾貞CCS動畫2019/3/8xxxxxxxxxx40CCAnimate動畫動作就是一個動作類??梢酝ㄟ^CCAnimation動畫來定義CCAnimate動畫動作sprite->runAction(CCRepeatForever::create(CCAnimate::create(animation)));動畫2019/3/8xxxxxxxxxx40CCAnimat使用plist配置文件實現(xiàn)動畫2019/3/8xxxxxxxxxx41在Mac系統(tǒng)的Cocoa等編程框架中,屬性列表文件是一種用來存儲串行化后的對象的文件。屬性列表文件的擴展名為plist,因此通常被稱為plist文件。plist文件通常用于儲存用戶設置,也可以用于存儲捆綁的信息,該功能在舊式的Mac系統(tǒng)中是由資源分支提供的。CCSpriteFrameCache*frameCache=CCSpriteFrameCache::sharedSpriteFrameCache();frameCache->addSpriteFramesWithFile("animations/grossini.plist");frameCache->addSpriteFramesWithFile("animations/grossini_gray.plist");frameCache->addSpriteFramesWithFile("animations/grossini_blue.plist");CCAnimationCache::purgeSharedAnimationCache();CCAnimationCache*animCache=CCAnimationCache::sharedAnimationCache();animCache->addAnimationsWithFile("animations/animations.plist");使用plist配置文件實現(xiàn)動畫2019/3/8xxxxxxx2019/3/8xxxxxxxxxx42<?xmlversion="1.0"encoding="utf-8”?><!DOCTYPEplistPUBLIC"-//Ap

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論