【Cocos2d-X開發學習筆記】第17期:動作類之跟隨動作、可調整速度動作以及動作延時的使用

本系列學習教程使用的是cocos2d-x-2.1.4(最新版爲3.0alpha0-pre) ,PC開發環境Windows7,C++開發環境VS2010


 

一、跟隨動作


跟隨動作CCFollow是一個節點跟隨另外一個節點的動作。

 

1、CCFollow的用法

CCFollow * create(CCNode * pFollowedNode,const CCRect & rect = CCRectZero)

作用:創建一個跟隨的動作。

參數1:跟隨的目標。

參數2:跟隨範圍,離開範圍就不在跟隨。

2、示例代碼如下所示。

 

    新建Cocos2D-X項目,取名爲“CCActionFollow”,然後在HelloWorldScene.cpp文件的init函數中添加如下代碼。

bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        CC_BREAK_IF(! CCLayer::init());

		//獲得尺寸大小
		CCSize s = CCDirector::sharedDirector()->getWinSize();

		//創建精靈
        CCSprite* m_grossini = CCSprite::create("grossini.png");

		//設置精靈的位置
        m_grossini->setPosition(ccp(-200, s.height/2));  

		//添加精靈到圖層
		addChild(m_grossini, 1);

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

		this->runAction(CCFollow::create(m_grossini, CCRectMake(0, 0, s.width * 2 - 100, s.height)));

        bRet = true;
    } while (0);

    return bRet;
}

定義第一個參數是要跟隨的節點,第二個參數是運動的邊界。如果沒有傳入邊界,則視爲沒有邊界。


3、示例效果圖。

運行過程中的效果,可以看出屏幕跟隨精靈的移動而移動,而固定不動的菜單項已經由於相對運動移除屏幕。



二、可調整速度動作


      可調整速度動作CCSpeed不是一個獨立的動作,可以把它理解爲是對目前動作的“包裝”,經過這個“包裝”以

後,就可以實現“慢動作”和“快進”的效果,使用CCSpeed來處理很方便。

 

1、CCSpeed的用法

CCSpeed* create(CCActionInterval * pAction,float fSpeed)

作用:讓目標動作運行速度加倍。

參數1:目標動作。

參數2:倍速。


2、項目示例

 

出自TestCpp項目的ActionEaseTest.cpp文件中SpeedTest類的onEnter函數和altertime函數。

void SpeedTest::onEnter()
{
    EaseSpriteDemo::onEnter();
    
    CCSize s = CCDirector::sharedDirector()->getWinSize();

    // rotate and jump
    CCActionInterval *jump1 = CCJumpBy::create(4, ccp(-s.width+80, 0), 100, 4);
    CCActionInterval *jump2 = jump1->reverse();
    CCActionInterval *rot1 = CCRotateBy::create(4, 360*2);
    CCActionInterval *rot2 = rot1->reverse();
    
    CCSequence* seq3_1 = CCSequence::create(jump2, jump1, NULL);
    CCSequence* seq3_2 = CCSequence::create( rot1, rot2, NULL);
    CCSpawn* spawn = CCSpawn::create(seq3_1, seq3_2, NULL);
    CCSpeed* action = CCSpeed::create(CCRepeatForever::create(spawn), 1.0f);
    action->setTag(kTagAction1);
    
    CCAction* action2 = (CCAction*)(action->copy()->autorelease());
    CCAction* action3 = (CCAction*)(action->copy()->autorelease());

    action2->setTag(kTagAction1);
    action3->setTag(kTagAction1);
    
    m_grossini->runAction(action2);
    m_tamara->runAction(action3);
    m_kathia->runAction(action);
    
    this->schedule(schedule_selector(SpeedTest::altertime), 1.0f);//:@selector(altertime:) interval:1.0f];
}

void SpeedTest::altertime(float dt)
{    
    CCSpeed* action1 = (CCSpeed*)(m_grossini->getActionByTag(kTagAction1));
    CCSpeed* action2 = (CCSpeed*)(m_tamara->getActionByTag(kTagAction1));
    CCSpeed* action3 = (CCSpeed*)(m_kathia->getActionByTag(kTagAction1));
    
    action1->setSpeed( CCRANDOM_MINUS1_1() * 2 );
    action2->setSpeed( CCRANDOM_MINUS1_1() * 2 );
    action3->setSpeed( CCRANDOM_MINUS1_1() * 2 );
}

     在onEnter函數中,就是定義普通動作,並使用schedule,使得每1.0s調用altertime函數。在altertime函數中,通過

getActionByTag獲得動作,把它們視作CCSpeed,並使用setSpeed設置速度:設置1,是原速度;大於1,速度加

快,小於1,速度減慢。

 

3、示例效果圖

 

可以看出,剛開始未調用altertime函數時,三個精靈的動作步調一致。

 

調用altertime函數後,動作步調開始不同

 

 

 

三、動作延時


動作延時CCDelayTime就是動作延後一段固定的時間,可以把它理解爲一個“空動作”,只有時間,沒有任何動作。

 

 

1、示例代碼如下所示。


     首先新建項目,取名爲“MyCCActionDelayTime”,然後在HelloWorldScene.cpp文件的init函數中添加如下代碼。

bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {

        CC_BREAK_IF(! CCLayer::init());

		//獲得尺寸大小
		CCSize s = CCDirector::sharedDirector()->getWinSize();

		//創建精靈
		CCSprite* m_grossini = CCSprite::create("grossini.png");
		
		//設置精靈的位置
		m_grossini->setPosition(ccp(60, s.height/2));

		//添加精靈到圖層
		addChild(m_grossini, 1);

        CCActionInterval*  move = CCMoveBy::create(1, ccp(150,0));
		CCFiniteTimeAction*  action = CCSequence::create( move, CCDelayTime::create(2), move, NULL);

		m_grossini->runAction(action);

        bRet = true;
    } while (0);

    return bRet;
}

它一般要放入CCSequence動作序列中才能看到效果。定義它也很簡單,參數爲間隔時間。

 

2、示例效果圖。

 

動作執行到這裏會停頓兩秒鐘。

 

兩秒鐘之後移動到如下圖所示的位置。

 

 

 

源碼下載地址

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