cocos2dx[2.x](16)--基本動作CCAction
阿新 • • 發佈:2019-02-14
【嘮叨】
在電影裡,角色的運動就是動作。而在遊戲裡,動畫就是角色的動作了。例如人物走動、跳躍、釋放魔法,鳥兒飛翔,車輪滾動等。動作是遊戲中不可或缺的重要組成部分,使得遊戲更具魅力,變得豐富活力。
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專案。
提示:可以多多運用組合動作,將不同的動作組合在一起,可能會有各種神奇的效果。