cocos2dx基礎篇(21)——基本動作CCAction

來源:互聯網
上載者:User

標籤:cocos2dx   ccaction   


【嘮叨】

    在電影裡,角色的運動就是動作。而在遊戲裡,動畫就是角色的動作了。例如人物走動、跳躍、釋放魔法,鳥兒飛翔,車輪滾動等。動作是遊戲中不可或缺的重要組成部分,使得遊戲更具魅力,變得豐富活力。

    cocos2dx引擎為我們提供了十分豐富的動作系統。在本節主要講講cocos2dx動作系統中最基本的動作。

    本節內容比較多,需要慢慢消化……


【致謝】

    http://gl.paea.cn/contents/fdb2fb923944b2e6.html

    《Cocos2D-X遊戲開發技術精解》劉建卓 著(別誤會,我不是來推銷書的650) this.width=650;" src="http://img.baidu.com/hi/face/i_f19.gif" alt="i_f19.gif" />)



【CCAction】

    CCAction是所有動作的基類。

    繼承關係如下:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/47/B8/wKiom1P-7iiClJuSAACQj8pwumA316.jpg" title="CCAction.jpg" alt="wKiom1P-7iiClJuSAACQj8pwumA316.jpg" />

    而我們主要關注的是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到255CCFadeOut::create("時間"); //淡出,透明度從255到0CCFadeTo::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對象同步移動。

    就像如所示,圖層跟精靈圖片同步移動。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/47/C0/wKiom1P_UNHiW2hWAApW6Y3K9tg228.gif" title="1.gif" alt="wKiom1P_UNHiW2hWAApW6Y3K9tg228.gif" />

    使用方法:

///** *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);//建立精靈spCCSprite* 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*320CCFollow* follow = CCFollow::create(sp, CCRectMake(0, 0, 1000, 320));this->runAction(follow);//



【代碼實戰】

    內容太多,請自行實現,可以參考官方TestCpp項目。

    提示:可以多多運用組合動作,將不同的動作組合在一起,可能會有各種神奇的效果。



【Demo下載】

    無。




本文出自 “夏天的風” 部落格,請務必保留此出處http://shahdza.blog.51cto.com/2410787/1546343

cocos2dx基礎篇(21)——基本動作CCAction

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.