天天看點

cocos2d-x CCAction動作學習筆記

1、ActionManual中設定三個精靈的放縮,旋轉,顔色和位置

m_tamara->setScaleX( 2.5f);
    m_tamara->setScaleY( -1.0f);
    m_tamara->setPosition( ccp(100,70) );
    m_tamara->setOpacity( 128);

    m_grossini->setRotation( 120);
    m_grossini->setPosition( ccp(s.width/2, s.height/2));
    m_grossini->setColor( ccc3( 255,0,0));

    m_kathia->setPosition( ccp(s.width-100, s.height/2));
    m_kathia->setColor( ccBLUE);
           

2、ActionMove移動處理

centerSprites(3);
    CCSize s = CCDirector::sharedDirector()->getWinSize();
    -- 分别建立CCMoveTo,CCMoveBy動作
    CCActionInterval*  actionTo = CCMoveTo::create(2, ccp(s.width-40, s.height-40));
    CCActionInterval*  actionBy = CCMoveBy::create(2, ccp(80,80));
    CCActionInterval*  actionByBack = actionBy->reverse();
    -- 三個精靈分别執行各自的動作
    m_tamara->runAction( actionTo);
    m_grossini->runAction( CCSequence::create(actionBy, actionByBack, NULL));
    m_kathia->runAction(CCMoveTo::create(1, ccp(40,40)));
           

3、ActionScale放縮處理

centerSprites(3);
    -- 建立CCScaleTo,CCScaleBy動作
    CCActionInterval*  actionTo = CCScaleTo::create(2.0f, 0.5f);
    CCActionInterval*  actionBy = CCScaleBy::create(2.0f, 1.0f, 10.0f);
    CCActionInterval*  actionBy2 = CCScaleBy::create(2.0f, 5.0f, 1.0f);
    m_grossini->runAction( actionTo);
    m_tamara->runAction( CCSequence::create(actionBy, actionBy->reverse(), NULL));
    m_kathia->runAction( CCSequence::create(actionBy2, actionBy2->reverse(), NULL));
           

4、建立CCSkewTo動作,參數對應變換時間,x扭曲,y扭曲

// static CCSkewTo* create(float t, float sx, float sy);
// static CCSkewBy* create(float t, float deltaSkewX, float deltaSkewY);
// CCSequence* CCSequence::create(CCFiniteTimeAction *pAction1, ...) 建立可變數目的一系列動作
    CCActionInterval *actionTo = CCSkewTo::create(2, 37.2f, -37.2f);
    CCActionInterval *actionToBack = CCSkewTo::create(2, 0, 0);
    CCActionInterval *actionBy = CCSkewBy::create(2, 0.0f, -90.0f);
    CCActionInterval *actionBy2 = CCSkewBy::create(2, 45.0f, 45.0f);
    CCActionInterval *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));
           

5、建立ActionRotationalSkew變換,fDuration時間内,X方向旋轉變化fDeltaAngleX,Y方向旋轉變化fDeltaAngleY

// CCRotateTo* CCRotateTo::create(float fDuration, float fDeltaAngleX, float fDeltaAngleY)
// CCRotateBy* CCRotateBy::create(float fDuration, float fDeltaAngleX, float fDeltaAngleY)
    CCRotateTo* actionTo = CCRotateTo::create(2, 37.2f, -37.2f);
    CCRotateTo* actionToBack = CCRotateTo::create(2, 0, 0);
    CCRotateBy* actionBy = CCRotateBy::create(2, 0.0f, -90.0f);
    CCRotateBy* actionBy2 = CCRotateBy::create(2, 45.0f, 45.0f);
    CCRotateBy* actionByBack = (CCRotateBy*)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));
           

6、ActionRotationalSkewVSStandardSkew旋轉扭曲與标準扭曲對比

CCSize s = CCDirector::sharedDirector()->getWinSize();
    CCSize boxSize = CCSizeMake(100.0f, 100.0f);
// 建立一個CCLayerColor層顔色:ccc4(255,255,0,255),設定錨點,内容大小,開啟錨點有效,然後把它加入到場景中
    CCLayerColor *box = CCLayerColor::create(ccc4(255,255,0,255));
    box->setAnchorPoint(ccp(0.5,0.5));
    box->setContentSize( boxSize );
    box->ignoreAnchorPointForPosition(false);
    box->setPosition(ccp(s.width/2, s.height - 100 - box->getContentSize().height/2));
    this->addChild(box);
// 添加描述性文字,1:顯示字元串,2:字型名稱,3:字型大小
// CCLabelTTF * CCLabelTTF::create(const char *string, const char *fontName, float fontSize)
    CCLabelTTF *label = CCLabelTTF::create("Standard cocos2d Skew", "Marker Felt", 16);
    label->setPosition(ccp(s.width/2, s.height - 100 + label->getContentSize().height));
    this->addChild(label);
// 建立動作序列 ,對應Standard cocos2d Skew
    CCSkewBy* actionTo = CCSkewBy::create(2, 360, 0);
    CCSkewBy* actionToBack = CCSkewBy::create(2, -360, 0);
    box->runAction(CCSequence::create(actionTo, actionToBack, NULL));

    box = CCLayerColor::create(ccc4(255,255,0,255));
    box->setAnchorPoint(ccp(0.5,0.5));
    box->setContentSize(boxSize);
    box->ignoreAnchorPointForPosition(false);
    box->setPosition(ccp(s.width/2, s.height - 250 - box->getContentSize().height/2));
    this->addChild(box);
    label = CCLabelTTF::create("Rotational Skew", "Marker Felt", 16);
    label->setPosition(ccp(s.width/2, s.height - 250 + label->getContentSize().height/2));
    this->addChild(label);
// 建立動作序列,對應Rotational Skew
    CCRotateBy* actionTo2 = CCRotateBy::create(2, 360, 0);
    CCRotateBy* actionToBack2 = CCRotateBy::create(2, -360, 0);
    box->runAction(CCSequence::create(actionTo2, actionToBack2, NULL));
           

7、ActionSkewRotateScale建立不同動作的組合

CCSize boxSize = CCSizeMake(100.0f, 100.0f);
// 建立一個box層用來執行動畫序列
    CCLayerColor *box = CCLayerColor::create(ccc4(255, 255, 0, 255));
    box->setAnchorPoint(ccp(0, 0));
    box->setPosition(ccp(190, 110));
    box->setContentSize(boxSize);
// 建立兩個小格子,紅色左邊,藍色右邊
    static float markrside = 10.0f;
    CCLayerColor *uL = CCLayerColor::create(ccc4(255, 0, 0, 255));
    box->addChild(uL);
    uL->setContentSize(CCSizeMake(markrside, markrside));
    uL->setPosition(ccp(0.f, boxSize.height - markrside));
    uL->setAnchorPoint(ccp(0, 0));

    CCLayerColor *uR = CCLayerColor::create(ccc4(0, 0, 255, 255));
    box->addChild(uR);
    uR->setContentSize(CCSizeMake(markrside, markrside));
    uR->setPosition(ccp(boxSize.width - markrside, boxSize.height - markrside));
    uR->setAnchorPoint(ccp(0, 0));
    addChild(box);
// 建立扭曲,旋轉,放縮的動作序列
    CCActionInterval *actionTo = CCSkewTo::create(2, 0.f, 2.f);
    CCActionInterval *rotateTo = CCRotateTo::create(2, 61.0f);
    CCActionInterval *actionScaleTo = CCScaleTo::create(2, -0.44f, 0.47f);

    CCActionInterval *actionScaleToBack = CCScaleTo::create(2, 1.0f, 1.0f);
    CCActionInterval *rotateToBack = CCRotateTo::create(2, 0);
    CCActionInterval *actionToBack = CCSkewTo::create(2, 0, 0);
// 這裡讓顔色層同時執行三個動畫,runAction會把動作對象和主角傳給動畫管理器,這些動畫會存入相應的動畫集,動畫管理器會在每一幀更新相應的動畫,
// 雖然他們是動畫序列但本身仍然是動畫,是以多次調用runAction會将多個動畫或動畫序列同時播放
    box->runAction(CCSequence::create(actionTo, actionToBack, NULL));
    box->runAction(CCSequence::create(rotateTo, rotateToBack, NULL));
    box->runAction(CCSequence::create(actionScaleTo, actionScaleToBack, NULL));
           

8、旋轉動作序列,時間-旋轉角度

// CCRotateTo* CCRotateTo::create(float fDuration, float fDeltaAngle)
// CCRotateBy* CCRotateBy::create(float fDuration, float fDeltaAngle)
    CCActionInterval*  actionTo = CCRotateTo::create( 2, 45);
    CCActionInterval*  actionTo2 = CCRotateTo::create( 2, -45);
    CCActionInterval*  actionTo0 = CCRotateTo::create(2 , 0);
    m_tamara->runAction( CCSequence::create(actionTo, actionTo0, NULL));

    CCActionInterval*  actionBy = CCRotateBy::create(2 ,  360);
    CCActionInterval*  actionByBack = actionBy->reverse();
    m_grossini->runAction( CCSequence::create(actionBy, actionByBack, NULL));
    m_kathia->runAction( CCSequence::create(actionTo2, actionTo0->copy()->autorelease(), NULL));
           

9、跳動動畫序列,時間-位置點-跳躍高度-跳躍次數(to:跳到position,by:相對于目前位置跳轉position标示的相對位置)

// CCJumpTo* CCJumpTo::create(float duration, const CCPoint& position, float height, int jumps)
// CCJumpBy* CCJumpBy::create(float duration, const CCPoint& position, float height, unsigned int jumps)
    CCActionInterval*  actionTo = CCJumpTo::create(2, ccp(300,300), 50, 4);
    CCActionInterval*  actionBy = CCJumpBy::create(2, ccp(300,0), 50, 4);
    CCActionInterval*  actionUp = CCJumpBy::create(2, ccp(0,0), 80, 4);
    CCActionInterval*  actionByBack = actionBy->reverse();

    m_tamara->runAction( actionTo);
    m_grossini->runAction( CCSequence::create(actionBy, actionByBack, NULL));
    m_kathia->runAction( CCRepeatForever::create(actionUp));
           

10、貝塞爾曲線動作序列ActionBezier 

// CCBezierBy* CCBezierBy::create(float t, const ccBezierConfig& c)		時間-貝塞爾參數建立貝塞爾曲線動作序列
// CCRepeatForever *CCRepeatForever::create(CCActionInterval *pAction)		根據CCActionInterval對象建立永久性動作
    // 設定貝塞爾曲線的控制參數,控制點1-控制點2-結束點
    ccBezierConfig bezier;
    bezier.controlPoint_1 = ccp(0, s.height/2);
    bezier.controlPoint_2 = ccp(300, -s.height/2);
    bezier.endPosition = ccp(300,100);

    CCActionInterval*  bezierForward = CCBezierBy::create(3, bezier);
    CCActionInterval*  bezierBack = bezierForward->reverse();    
    CCAction*  rep = CCRepeatForever::create(CCSequence::create( bezierForward, bezierBack, NULL));
    m_grossini->runAction( rep);
           

11、閃爍動畫序列ActionBlink 時間-閃爍次數

// CCBlink* CCBlink::create(float duration, unsigned int uBlinks)
    CCActionInterval*  action1 = CCBlink::create(2, 2);
    CCActionInterval*  action2 = CCBlink::create(2, 10);

    m_tamara->runAction( action1);
    m_kathia->runAction(action2);
           

12、消隐動作序列CCFadeIn

// CCFadeIn* CCFadeIn::create(float d)			淡入(時間)
// CCFadeOut* CCFadeOut::create(float d)		淡出(時間)
    CCActionInterval*  action1 = CCFadeIn::create(1.0f);
    CCActionInterval*  action1Back = action1->reverse();
    CCActionInterval*  action2 = CCFadeOut::create(1.0f);
    CCActionInterval*  action2Back = action2->reverse();

    m_tamara->runAction( CCSequence::create( action1, action1Back, NULL));
    m_kathia->runAction( CCSequence::create( action2, action2Back, NULL));
           

13、色調調節CCTintTo/CCTintBy

// static CCTintTo* create(float duration, GLubyte red, GLubyte green, GLubyte blue);					時間-rgb顔色
// static CCTintBy* create(float duration, GLshort deltaRed, GLshort deltaGreen, GLshort deltaBlue);	時間-rgb顔色
    CCActionInterval*  action1 = CCTintTo::create(2, 255, 0, 255);
    CCActionInterval*  action2 = CCTintBy::create(2, -127, -255, -127);
    CCActionInterval*  action2Back = action2->reverse();

    m_tamara->runAction( action1);
    m_kathia->runAction( CCSequence::create( action2, action2Back, NULL));
           

14、ActionAnimate動畫效果

// static CCAnimation* create(void);							建立動畫效果
// void addSpriteFrameWithFileName(const char *pszFileName);	根據檔案名建立精靈幀,并加入到動畫序列中,有一定的時延
// static CCAnimate* create(CCAnimation *pAnimation);			根據動畫建立動作序列,能恢複到最初的精靈幀
// void addAnimationsWithFile(const char* plist);				根據給定的plist檔案添加一個動畫序列
// CCAnimation* animationByName(const char* name);				根據檔案名擷取之前添加的動畫序列
// 定義一個來建立保護成員變量,和它的一套擷取設定方,友善快捷的設定對象的屬性
// #define CC_SYNTHESIZE(varType, varName, funName)\
// protected: varType varName;\
// public: virtual varType get##funName(void) const { return varName; }\
// public: virtual void set##funName(varType var){ varName = var; }
           
CCAnimation* animation = CCAnimation::create();
    for( int i=1;i<15;i++)
    {
        char szName[100] = {0};
        sprintf(szName, "Images/grossini_dance_%02d.png", i);
        animation->addSpriteFrameWithFileName(szName);
    }
    // 設定每個精靈幀的時延為2.8f / 14.0f,并恢複到最初的精靈幀
    animation->setDelayPerUnit(2.8f / 14.0f);
    animation->setRestoreOriginalFrame(true);
    //根據動畫建立動作序列用來執行實際的動作
    CCAnimate* action = CCAnimate::create(animation);
    m_grossini->runAction(CCSequence::create(action, action->reverse(), NULL));
    
    //從plist檔案建立動畫效果
    CCAnimationCache *cache = CCAnimationCache::sharedAnimationCache();
    cache->addAnimationsWithFile("animations/animations-2.plist");
    CCAnimation *animation2 = cache->animationByName("dance_1");

    CCAnimate* action2 = CCAnimate::create(animation2);
    m_tamara->runAction(CCSequence::create(action2, action2->reverse(), NULL));

    //設定循環4次
    CCAnimation *animation3 = (CCAnimation *)animation2->copy()->autorelease();
    animation3->setLoops(4);
    CCAnimate* action3 = CCAnimate::create(animation3);
    m_kathia->runAction(action3);
           

15、動作序列建立

// CCSequence* CCSequence::create(CCFiniteTimeAction *pAction1, ...)	建立可變動個數的動作序列
    CCFiniteTimeAction*  action = CCSequence::create(
        CCMoveBy::create( 2, ccp(240,0)),
        CCRotateBy::create( 2,  540),
        NULL);

    m_grossini->runAction(action);
動作完成之後處理不同的函數
// static CCPlace * create(const CCPoint& pos);														建立節點在pos位置
// static CCShow * create();																		建立節點,并初始化
// static CCCallFunc * create(CCObject* pSelectorTarget, SEL_CallFunc selector);					建立動作附帶的回調函數,無參
// static CCCallFuncN * create(CCObject* pSelectorTarget, SEL_CallFuncN selector);					建立動作附帶的回調函數,節點對象
// static CCCallFuncND * create(CCObject* pSelectorTarget, SEL_CallFuncND selector, void* d);		建立動作附帶的回調函數,節點對象-資料
    CCFiniteTimeAction*  action = CCSequence::create(
    CCPlace::create(ccp(200,200)),
    CCShow::create(),
    CCMoveBy::create(1, ccp(100,0)),
    CCCallFunc::create(this, callfunc_selector(ActionSequence2::callback1)),
    CCCallFuncN::create(this, callfuncN_selector(ActionSequence2::callback2)),
    CCCallFuncND::create(this, callfuncND_selector(ActionSequence2::callback3), (void*)0xbebabeba),
    NULL);

    m_grossini->runAction(action);

對應的三個回調函數,我們可在裡面進行相應的處理
void ActionSequence2::callback1()
void ActionSequence2::callback2(CCNode* sender)
void ActionSequence2::callback3(CCNode* sender, void* data)
           

16、連續的動作序列

// static CCSpawn* create(CCFiniteTimeAction *pAction1, ...);	傳入動作序列,他會同時執行這幾個動作
    CCAction*  action = CCSpawn::create(
        CCJumpBy::create(2, ccp(300,0), 50, 4),
        CCRotateBy::create( 2,  720),
        NULL);

    m_grossini->runAction(action);
           

17、逆序動作序列ActionReverse

// virtual CCActionInterval* reverse(void);	傳回這個動作序列的逆序列
    CCActionInterval*  jump = CCJumpBy::create(2, ccp(300,0), 50, 4);
    CCFiniteTimeAction*  action = CCSequence::create( jump, jump->reverse(), NULL);
    m_grossini->runAction(action);
           

18、重複性的序列動作

// static CCRepeat* create(CCFiniteTimeAction *pAction, unsigned int times);	要重複的動作序列-次數
// static CCRepeatForever* create(CCActionInterval *pAction);					一直持續性的動作序列
    CCActionInterval*  a1 = CCMoveBy::create(1, ccp(150,0));
    CCActionInterval*  action1 = CCRepeat::create(
        CCSequence::create( CCPlace::create(ccp(60,60)), a1, NULL) , 
        3); 
    CCAction*  action2 = CCRepeatForever::create(
        CCSequence::create((CCActionInterval*)(a1->copy()->autorelease()), a1->reverse(), NULL)
        );
    m_kathia->runAction(action1);
    m_tamara->runAction(action2);
           

19、延時性的動作序列

// static CCDelayTime* create(float d);		延遲的時間,機關:秒
    CCActionInterval*  move = CCMoveBy::create(1, ccp(150,0));
    CCFiniteTimeAction*  action = CCSequence::create( move, CCDelayTime::create(2), move, NULL);
           
m_grossini->runAction(action);
           

20、逆序的一組動作序列

// 這裡的CCSequence本質上還是一個動作序列,雖然他包括了一組的動作序列,是以我們可以對他直接取逆序操作
    CCActionInterval*  move1 = CCMoveBy::create(1, ccp(250,0));
    CCActionInterval*  move2 = CCMoveBy::create(1, ccp(0,50));
    CCFiniteTimeAction*  seq = CCSequence::create( move1, move2, move1->reverse(), NULL);
    CCFiniteTimeAction*  action = CCSequence::create( seq, seq->reverse(), NULL);
    m_grossini->runAction(action);

    //   一組動作序列包括IntervalAction和InstantActions兩種
    // class CC_DLL CCToggleVisibility : public CCActionInstant	轉變節點的可見性,new出來的要自動釋放(顯示調用autorelease)
    CCActionInterval*  move1 = CCMoveBy::create(1, ccp(250,0));
    CCActionInterval*  move2 = CCMoveBy::create(1, ccp(0,50));
    CCToggleVisibility*  tog1 = new CCToggleVisibility();
    CCToggleVisibility*  tog2 = new CCToggleVisibility();
    tog1->autorelease();
    tog2->autorelease();
    CCFiniteTimeAction*  seq = CCSequence::create( move1, tog1,tog2, move2,  move1->reverse(), NULL);
    CCActionInterval*  action = CCRepeat::create(CCSequence::create( seq, seq->reverse(), NULL), 3);
    m_kathia->runAction(action);

    //   class CC_DLL CCHide : public CCActionInstant 用來隐藏一個節點
    CCActionInterval*  move_tamara = CCMoveBy::create(1, ccp(100,0));
    CCActionInterval*  move_tamara2 = CCMoveBy::create(1, ccp(50,0));
    CCActionInstant*  hide = CCHide::create();
    CCFiniteTimeAction*  seq_tamara = CCSequence::create( move_tamara, hide, move_tamara2, NULL);
    CCFiniteTimeAction*  seq_back = seq_tamara->reverse();
    m_tamara->runAction( CCSequence::create( seq_tamara, seq_back, NULL));
           

21、建立一個球面坐标軌迹進行的旋轉動作序列

// 參數:旋轉軌迹的時間差-起始半徑-半徑差-起始z角-旋轉z角差-起始x角-旋轉x角差
// static CCOrbitCamera* create(float t, float radius, float deltaRadius, float angleZ, float deltaAngleZ, float angleX, float deltaAngleX);

    CCActionInterval*  orbit1 = CCOrbitCamera::create(2,1, 0, 0, 180, 0, 0);
    CCSequence*  action1 = CCSequence::create(
        orbit1,
        orbit1->reverse(),
        NULL);
	m_kathia->runAction(CCRepeatForever::create(action1));

    CCActionInterval*  move = CCMoveBy::create(3, ccp(100,-100));
    CCActionInterval*  move_back = move->reverse();
    CCSequence*  seq = CCSequence::create(move, move_back, NULL);
    CCAction*  rfe = CCRepeatForever::create(seq);
    m_kathia->runAction(rfe);
           

22、移除節點動作

// static CCRemoveSelf * create(bool isNeedCleanUp = true);	移除自身,并預設清空自身
	CCFiniteTimeAction*  action = CCSequence::create(
		CCMoveBy::create( 2, ccp(240,0)),
		CCRotateBy::create( 2,  540),
		CCScaleTo::create(1,0.1f),
		CCRemoveSelf::create(),
		NULL);
	m_grossini->runAction(action);
           

23、ActionRepeatForever重複動作放在動作的毀掉函數中

CCFiniteTimeAction*  action = CCSequence::create(
        CCDelayTime::create(1),
        CCCallFuncN::create( this, callfuncN_selector(ActionRepeatForever::repeatForever) ), 
        NULL);

    m_grossini->runAction(action);
// 回調加入永遠執行的旋轉動作
void ActionRepeatForever::repeatForever(CCNode* pSender)
{
    CCRepeatForever *repeat = CCRepeatForever::create( CCRotateBy::create(1.0f, 360) );
    pSender->runAction(repeat);
}
// 旋轉的重複動作
    CCActionInterval*  act1 = CCRotateTo::create(1, 90);
    CCActionInterval*  act2 = CCRotateTo::create(1, 0);
    CCActionInterval*  seq = CCSequence::create(act1, act2, NULL);
    CCAction*  rep1 = CCRepeatForever::create(seq);
    m_tamara->runAction(rep1);
           

24、建立跟随動作CCFollow

// static CCFollow* create(CCNode *pFollowedNode, const CCRect& rect = CCRectZero);    建立跟随動作序列,在指定的矩形區域中
    CCSize s = CCDirector::sharedDirector()->getWinSize();
    m_grossini->setPosition(ccp(-200, s.height / 2));
    // 建立相對移動的動作序列
    CCActionInterval* move      = CCMoveBy::create(2, ccp(s.width * 3, 0));
    CCActionInterval* move_back = move->reverse();
    CCSequence* seq       = CCSequence::create(move, move_back, NULL);
    CCAction* rep               = CCRepeatForever::create(seq);
    m_grossini->runAction(rep);
    // 在指定的區域CCRectMake跟随精靈m_grossini,
    this->runAction(CCFollow::create(m_grossini, CCRectMake(0, 0, s.width * 2 - 100, s.height)));

    // 繪制精靈移動的部分舉行區域
    void ActionFollow::draw()
    {
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
        
        float x = winSize.width*2 - 100;
        float y = winSize.height;
        
        CCPoint vertices[] = { ccp(5,5), ccp(x-5,5), ccp(x-5,y-5), ccp(5,y-5) };
        ccDrawPoly(vertices, 4, true);
    }
           

25、建立指定節點對象的動作序列,可以使兩個對象按照順序示範動作序列

// static CCTargetedAction* create(CCNode* pTarget, CCFiniteTimeAction* pAction);  根據一個節點對象和動作序列建立,把動作序列綁定到節點對象
    CCJumpBy* jump1 = CCJumpBy::create(2,CCPointZero,100,3);
    CCJumpBy* jump2 = (CCJumpBy*)jump1->copy()->autorelease();
    CCRotateBy* rot1 =  CCRotateBy::create(1, 360);
    CCRotateBy* rot2 = (CCRotateBy*)rot1->copy()->autorelease();
// 把jump2和rot2動作序列綁定到精靈m_kathia
    CCTargetedAction *t1 = CCTargetedAction::create(m_kathia, jump2);
    CCTargetedAction *t2 = CCTargetedAction::create(m_kathia, rot2);
    CCSequence* seq = (CCSequence*)CCSequence::create(jump1, t1, rot1, t2, NULL);
    CCRepeatForever *always = CCRepeatForever::create(seq);
    m_tamara->runAction(always);
           

26、添加震動的精靈動作序列

// static CCTargetedAction* create(CCNode* pTarget, CCFiniteTimeAction* pAction);  根據一個節點對象和動作序列建立,把動作序列綁定到節點對象
    CCJumpBy* jump1 = CCJumpBy::create(2,CCPointZero,100,3);
    CCJumpBy* jump2 = (CCJumpBy*)jump1->copy()->autorelease();
    CCRotateBy* rot1 =  CCRotateBy::create(1, 360);
    CCRotateBy* rot2 = (CCRotateBy*)rot1->copy()->autorelease();
// 把jump2和rot2動作序列綁定到精靈m_kathia
    CCTargetedAction *t1 = CCTargetedAction::create(m_kathia, jump2);
    CCTargetedAction *t2 = CCTargetedAction::create(m_kathia, rot2);
    CCSequence* seq = (CCSequence*)CCSequence::create(jump1, t1, rot1, t2, NULL);
    CCRepeatForever *always = CCRepeatForever::create(seq);
    m_tamara->runAction(always);
           

27、添加暫停,重新執行動作序列處理

// 在3秒暫停旋轉動作,5s恢複動作序列
    m_tamara->runAction(CCRepeatForever::create(CCRotateBy::create(3, 360)));
    m_grossini->runAction(CCRepeatForever::create(CCRotateBy::create(3, -360)));
    m_kathia->runAction(CCRepeatForever::create(CCRotateBy::create(3, 360)));
    
    this->schedule(schedule_selector(PauseResumeActions::pause), 3, false, 0);
    this->schedule(schedule_selector(PauseResumeActions::resume), 5, false, 0);

void PauseResumeActions::pause(float dt)
{
    // 暫停所有的運作動作
    CCLog("Pausing");
    CCDirector *director = CCDirector::sharedDirector();
    CC_SAFE_RELEASE(m_pPausedTargets);
    m_pPausedTargets = director->getActionManager()->pauseAllRunningActions();
    CC_SAFE_RETAIN(m_pPausedTargets);
}

void PauseResumeActions::resume(float dt)
{
    // 恢複所有的動作序列的執行
    CCLog("Resuming");
    CCDirector *director = CCDirector::sharedDirector();
    director->getActionManager()->resumeTargets(m_pPausedTargets);
}
           

繼續閱讀