1. 程式人生 > >cocos2dx[2.x](16)--基本動作CCAction

cocos2dx[2.x](16)--基本動作CCAction

【嘮叨】

在電影裡,角色的運動就是動作。而在遊戲裡,動畫就是角色的動作了。例如人物走動、跳躍、釋放魔法,鳥兒飛翔,車輪滾動等。動作是遊戲中不可或缺的重要組成部分,使得遊戲更具魅力,變得豐富活力。
cocos2dx引擎為我們提供了十分豐富的CCAction動作系統。在本節主要講講cocos2dx動作系統中最基本的動作。
本節內容比較多,需要慢慢消化……

【致謝】

【3.x】

(1)去掉“CC”
(2)新增了一些動作:(精力有限,新增的動作請自行摸索)
    > EaseBezierAction
    > EaseQuadraticActionIn / Out / InOut
    > EaseQuarticActionIn / Out / InOut
    > EaseQuinticActionIn / Out / InOut
    > EaseCircleActionIn / Out / InOut
    > EaseCubicActionIn / Out / InOut
(3)CallFunc 的新用法:http://shahdza.blog.51cto.com/2410787/1553051
(4)其他變化不大。

【CCAction】

CCAction是所有動作的基類。
繼承關係如下:

這裡寫圖片描述

而我們主要關注的是CCAction的子類,以及子類的子類。

(1)CCFiniteTimeAction:與時間相關的的動作類。
     它又可以分為兩個子類:
        (A)CCActionInstant:瞬間動作相關的動作類。
        (B)CCActionInterval:持續動作相關的動作類。
(2)CCFollow:跟隨動作類。
(3)CCSpeed:速度類。

接下來,將對三大類進行細分講解。其組織結構如下:
(0)動作管理
(1)瞬時動作CCActionInstant
(2)持續動作CCActionInterval
(3)函式回撥動作CCCallFunc
(4)組合動作
(5)可變速動作CCEaseAction
(6)速度類CCSpeed
(7)延遲動作CCDelayTime
(8)跟隨動作CCFollow

0、動作管理

用於管理物件的動作執行。如執行、暫停、停止等。
常用操作如下:
    sp->runAction("action物件");     //執行
    sp->pauseSchedulerAndActions();  //暫停
    sp->resumeSchedulerAndActions(); //繼續
    sp->stopAction("action物件");    //停止物件的某個action動作
    sp->stopActionByTag("tag值");    //停止物件的tag動作
    sp->stopAllActions()
; //停止物件的所有動作

1、瞬時動作CCActionInstant

CCActionInstant繼承於CCFiniteTimeAction,是一個瞬間執行的動作類。即執行的動作的時間間隔為零。
使用方法舉例:
    //瞬間翻轉Y動作
    CCSprite* sp = CCSprite::create("Icon.png");
    CCFlipY* flipY = CCFlipY::create(true); 
    sp->runAction(flipY); 
常用動作如下:
    //翻轉
    CCFlipX::create('是否左右翻轉bool');
    CCFlipY::create('是否上下翻轉bool');

    //設定座標
    CCPlace::create('位置CCPoint');

    //顯示、隱藏
    //即:setVisible(),來設定可見/不可見
    CCShow::create();
    CCHide::create();

    //可見切換
    //即可見變不可見,不可見變可見。
    CCToggleVisibility::create();

2、持續動作CCActionInterval

CCActionInstant繼承於CCFiniteTimeAction,是一個持續執行的動作類。也就是說在一段時間間隔裡,執行完成某個動作。
使用方法舉例:
    //1.0秒內移動到(200,200)
    CCSprite* sp = CCSprite::create("Icon.png");
    CCMoveTo* moveTo = CCMoveTo::create(1.0f, ccp(200, 200)); 
    sp->runAction(moveTo);
常用動作如下:
/**
 *  關於To和By:
 *      To:絕對動作。
 *      By:相對動作。
 *
 *  如:當前物件的座標為(20,20)。
 *      CCMoveTo(50,50)後,移動到了(50,50)的位置。
 *      CCMoveBy(50,50)後,則是相對當前座標進行移動,最後座標為(70,70)。
 */


/**
 *      移動相關
 */
    //幾秒後移動到座標點
    CCMoveTo::create("時間","座標");
    CCMoveBy::create("時間","座標");

    //幾秒後經過幾次彈跳到指定位置
    CCJumpTo::create("時間","目標位置","高度","到目標所需次數");
    CCJumpBy::create("時間","目標位置","高度","到目標所需次數");

    //幾秒內按指定貝塞爾曲線運動
    CCBezierTo::create("時間","ccBezierConfig構造體");
    CCBezierBy::create("時間","ccBezierConfig構造體");

    //幾秒內按曲線運動(擬合度0最柔和)
    CCCardinalSplineTo::create("時間","控制點座標陣列","擬合度");
    CCCardinalSplineBy::create("時間","控制點座標陣列","擬合度");

    //幾秒內完成一個樣條插值軌跡(直線)
    CCCatmullRomTo::create("時間","控制點座標陣列");
    CCCatmullRomBy::create("時間","控制點座標陣列");

    //幾秒內球面運動
    CCOrbitCamera::create("時間","起始半徑","半徑差","起始z角","旋轉z角","起始x角","旋轉x角");


/**
 *      放縮相關
 */
    //幾秒後縮放到指定大小(1:原大小;大於1:放大;小於1:縮小)
    CCScaleTo::create("時間","縮放比例");
    CCScaleBy::create("時間","縮放比例");


/**
 *      旋轉相關
 */
    //幾秒後旋轉多少度,單位:角度
    CCRotateTo::create("時間","角度");
    CCRotateBy::create("時間","角度");


/**
 *      傾斜相關
 */
    //幾秒後傾斜指定角度,單位:角度
    CCSkewTo::create("時間","x軸角度","y軸角度");
    CCSkewBy::create("時間","x軸角度","y軸角度");


/**
 *      顏色相關
 */
    //幾秒後變為指定RGB顏色,顏色取值[0,255]
    CCTintTo::create("時間","紅","綠","藍");
    CCTintBy::create("時間","紅","綠","藍");

    //設定透明度[0,255](255為不透明)
    CCFadeIn::create("時間");  //淡入,透明度從0到255
    CCFadeOut::create("時間"); //淡出,透明度從255到0
    CCFadeTo::create(1.0f,80); //透明度轉化為指定值

    //幾秒內閃爍幾次
    CCBlink::create("時間","次數");

3、函式回撥動作CCCallFunc

CCCallFunc也是瞬時動作CCActionInstant的子類。它主要有三種函式回撥動作類。三種函式回撥的區別在於所帶的引數個數:0、1、2。
    CCCallFunc::create('物件this', '回撥函式');                   //回撥函式:不帶引數
    CCCallFuncN::create('物件this', '回撥函式');                  //回撥函式:傳遞著本身作為引數(CCNode* node)
    CCCallFuncND::create('物件this', '回撥函式', '任意引數void'); //回撥函式:帶2個引數(CCNode* node,void* a)
使用方法:
    //定義函式回撥動作
    CCCallFunc* back1 = CCCallFunc::create(this, callfunc_selector(MyLayer::funback1));
    CCCallFuncN* back2 = CCCallFuncN::create(this, callfuncN_selector(MyLayer::funback2));
    CCCallFuncND* back3 = CCCallFuncND::create(this, callfuncND_selector(MyLayer::funback3),(void *)10);

    //回撥函式
    void MyLayer::funback1() { ... }                     //CCCallFunc回撥函式
    void MyLayer::funback2(CCNode* node) { ... }         //CCCallFuncN回撥函式
    void MyLayer::funback3(CCNode* node,void* a) { ... } //CCCallFuncND回撥函式

4、組合動作

組合動作,顧名思義,就是將單一的動作組合起來,形成一個更加複雜的動作。
如在移動的同時又進行旋轉,在彈跳後執行函式回撥動作等等……
組合動作的類也是CCActionInterval的子類,主要分為兩類:序列動作、重複動作。
(1)序列動作:執行各個動作的先後順序。
    CCSpawn::create("action物件1", "action物件2", ..., NULL);    //動作同時執行
    CCSequence::create("action物件1", "action物件2", ..., NULL); //動作按順序執行
(2)重複動作:重複迴圈執行某一動作,當然action物件也可以是序列動作。
    CCRepeat::create("action物件","次數"); //重複次數
    CCRepeatForever::create("action物件"); //無限重複
使用方法:
    //每次移動後閃爍3次,重複無限次。
    CCSprite* sp = CCSprite::create("Icon.png");

    CCMoveBy* move = CCMoveBy::create(1.0f, ccp(10, 10));
    CCBlink* blink = CCBlink::create(1.0f, 3);
    CCSequence* seq = CCSequence::create(move, blink, NULL);
    CCRepeatForever* repeatForever = CCRepeatForever::create(seq);

    sp->runAction(repeatForever);

5、可變速動作CCEaseAction

CCEaseAction也是CCActionInterval的子類。此類動作的特點在於動作執行的過程中速度是可以變化的。如:CCMoveTo,可以加速或減速的進行移動,也可以先加速再減速的移動。
有該類的存在,是因為遊戲中有些動作並不是均勻執行的,就像自由落體的球,下落速度會越來越快,而不是勻速下落。所以cocos2dx引擎封裝了一些常用的可變速度的類。
此類速度變化大致可分為三種:
(1)In   :   由慢變快。
(2)Out  :   由快變慢。
(3)InOut:   由慢變快,再變慢。
其中速度的快慢變化是依據物理學上的一些公式進行的。如正弦、指數等等。
值得注意的是:CCEaseAction變化的是某個持續性動作action動作執行過程中的速度,對於action動作執行的時間依舊是不會改變的。

常用的如下:
    其中關於CCEaseIn、CCEaseOut、CCEaseInOut的變化有點複雜。具體參照如下文章:
    http://www.cnblogs.com/cocos2d-x/archive/2012/03/15/2398516.html
    //線性變化。
    CCEaseIn::create("action物件", "加速率");     //由慢到快
    CCEaseOut::create("action物件", "加速率");    //由快到慢
    CCEaseInOut::create("action物件", "加速率");  //由慢到快再到慢

    //正弦變化。
    CCEaseSineIn::create("action物件");           //由慢到快
    CCEaseSineOut::create("action物件");          //由快到慢
    CCEaseSineInOut::create("action物件");        //由慢到快再到慢

    //指數變化。速度的變化按指數增長。
    CCEaseExponentialIn::create("action物件");    //緩慢開始
    CCEaseExponentialOut::create("action物件");   //緩慢結束
    CCEaseExponentialInOut::create("action物件"); //緩慢開始並緩慢結束

    //反彈變化。類似球碰到地面,不斷落下與反彈。
    CCEaseBounceIn::create("action物件");         //從起點反彈
    CCEaseBounceOut::create("action物件");        //從終點反彈     
    CCEaseBounceInOut::create("action物件");      //起點終點都反彈

    //回力變化。類似拉弓、回力標。
    CCEaseBackIn::create("action物件");           //起點作為回力點
    CCEaseBackOut::create("action物件");          //終點作為回力點
    CCEaseBackInOut::create("action物件");        //起點終點都作為回力點

    //伸縮式變化。
    CCEaseElasticIn::create("action物件");        //起點具有彈性
    CCEaseElasticOut::create("action物件");       //終點具有彈性
    CCEaseElasticInOut::create("action物件");     //起點終點都具有彈性
使用方法:
    CCSprite* sp = CCSprite::create("Icon.png");
    CCMoveBy* moveBy = CCMoveBy::create(5.0f, ccp(300, 300));
    CCEaseExponentialIn* easeMove = CCEaseExponentialIn::create(moveBy);
    sp->runAction(easeMove);

6、速度類CCSpeed

速度類CCSpeed和CCEaseAction沒有任何關係。它既不是瞬時動作,也不是持續動作。從繼承關係上來看,它直接繼承於CCAction。
它的作用是改變持續動作action執行的速率,這也就改變了動作執行所需的時間。就好比看電影時,覺得劇情放得太慢,就以兩倍的速度播放。
使用方法如下:
    //以5倍速度執行moveBy,執行完動作只需1.0秒。
    CCSprite* sp = CCSprite::create("Icon.png");
    CCMoveBy* moveBy = CCMoveBy::create(5.0f, ccp(300, 300));
    CCSpeed* speed = CCSpeed::create(moveBy, 5.0);
    sp->runAction(speed);

7、延遲動作CCDelayTime

CCDelayTime是CCActionInterval類。它用於序列動作CCSequence中,在兩個動作之間增加一個等待的時間段。如:執行完移動動作後,等待3秒,再執行閃爍動作。

使用方法如下:
    //移動後,等待3秒,再執行閃爍動作
    CCSprite* sp = CCSprite::create("Icon.png");
    CCMoveBy* moveBy = CCMoveBy::create(2.0f, ccp(300, 300));
    CCBlink* blink = CCBlink::create(2.0f, 10);
    CCDelayTime* delay = CCDelayTime::create(3.0);
    CCSequence* seq = CCSequence::create(moveBy, delay, blink, NULL);
    sp->runAction(seq);

8、跟隨動作CCFollow

CCFollow也是直接繼承CCAction的一個子類。它使得某個CCNode物件能夠跟隨另一個CCNode物件同步移動。
就像如下圖所示,圖層跟精靈圖片同步移動。

這裡寫圖片描述

使用方法:
/**
 *      CCFollow::create("跟隨的目標物件", "跟隨的範圍CCRect");
 *      此範圍是限制跟隨物件的移動區域
 */

    //獲得螢幕尺寸
    CCSize mysize = CCDirector::sharedDirector()->getVisibleSize();

    //bg.png尺寸1000*320。作為參照物
    CCSprite* bg = CCSprite::create("bg.png");
    bg->setPosition(CCPointZero);
    bg->setAnchorPoint(CCPointZero);
    this->addChild(bg);

    //建立精靈sp
    CCSprite* sp = CCSprite::create("Icon.png");
    sp->setPosition(ccp(0, 160));
    this->addChild(sp);

    //sp執行移動動作,5秒移動到(1000,160)
    CCMoveTo* moveTo = CCMoveTo::create(5.0f, ccp(1000, 160));
    sp->runAction(moveTo);

    //圖層this跟隨sp移動,跟隨範圍1000*320
    CCFollow* follow = CCFollow::create(sp, CCRectMake(0, 0, 1000, 320));
    this->runAction(follow);

【程式碼實戰】

內容太多,請自行實現,可以參考官方TestCpp專案。
提示:可以多多運用組合動作,將不同的動作組合在一起,可能會有各種神奇的效果。