您好,登錄后才能下訂單哦!
【嘮叨】
在電影里,角色的運動就是動作。而在游戲里,動畫就是角色的動作了。例如人物走動、跳躍、釋放魔法,鳥兒飛翔,車輪滾動等。動作是游戲中不可或缺的重要組成部分,使得游戲更具魅力,變得豐富活力。
cocos2dx引擎為我們提供了十分豐富的CCAction動作系統。在本節主要講講cocos2dx動作系統中最基本的動作。
本節內容比較多,需要慢慢消化……
【致謝】
http://gl.paea.cn/contents/fdb2fb923944b2e6.html
【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項目。
提示:可以多多運用組合動作,將不同的動作組合在一起,可能會有各種神奇的效果。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。