溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

cocos2dx基礎(chǔ)篇(21)——基本動(dòng)作CCAction

發(fā)布時(shí)間:2020-06-14 20:48:31 來(lái)源:網(wǎng)絡(luò) 閱讀:25878 作者:shahdza 欄目:開(kāi)發(fā)技術(shù)

【嘮叨】

    在電影里,角色的運(yùn)動(dòng)就是動(dòng)作。而在游戲里,動(dòng)畫(huà)就是角色的動(dòng)作了。例如人物走動(dòng)、跳躍、釋放魔法,鳥(niǎo)兒飛翔,車輪滾動(dòng)等。動(dòng)作是游戲中不可或缺的重要組成部分,使得游戲更具魅力,變得豐富活力。

    cocos2dx引擎為我們提供了十分豐富的CCAction動(dòng)作系統(tǒng)。在本節(jié)主要講講cocos2dx動(dòng)作系統(tǒng)中最基本的動(dòng)作。

    本節(jié)內(nèi)容比較多,需要慢慢消化……


【致謝】

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


【3.x】

    (1)去掉“CC”

    (2)新增了一些動(dòng)作:(精力有限,新增的動(dòng)作請(qǐng)自行摸索)

        > 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是所有動(dòng)作的基類。

    繼承關(guān)系如下:

cocos2dx基礎(chǔ)篇(21)——基本動(dòng)作CCAction

    而我們主要關(guān)注的是CCAction的子類,以及子類的子類。

    (1)CCFiniteTimeAction:與時(shí)間相關(guān)的的動(dòng)作類。

         它又可以分為兩個(gè)子類:

            (A)CCActionInstant:瞬間動(dòng)作相關(guān)的動(dòng)作類。

            (B)CCActionInterval:持續(xù)動(dòng)作相關(guān)的動(dòng)作類。

    (2)CCFollow:跟隨動(dòng)作類。

    (3)CCSpeed:速度類。


    接下來(lái),將對(duì)三大類進(jìn)行細(xì)分講解。其組織結(jié)構(gòu)如下:

    (0)動(dòng)作管理

    (1)瞬時(shí)動(dòng)作CCActionInstant

    (2)持續(xù)動(dòng)作CCActionInterval

    (3)函數(shù)回調(diào)動(dòng)作CCCallFunc

    (4)組合動(dòng)作

    (5)可變速動(dòng)作CCEaseAction

    (6)速度類CCSpeed

    (7)延遲動(dòng)作CCDelayTime

    (8)跟隨動(dòng)作CCFollow


0、動(dòng)作管理

    用于管理對(duì)象的動(dòng)作執(zhí)行。如運(yùn)行、暫停、停止等。

    常用操作如下:

//
	sp->runAction("action對(duì)象");     //執(zhí)行
	sp->pauseSchedulerAndActions();  //暫停
	sp->resumeSchedulerAndActions(); //繼續(xù)
	sp->stopAction("action對(duì)象");    //停止對(duì)象的某個(gè)action動(dòng)作
	sp->stopActionByTag("tag值");    //停止對(duì)象的tag動(dòng)作
	sp->stopAllActions();            //停止對(duì)象的所有動(dòng)作
//


1、瞬時(shí)動(dòng)作CCActionInstant

    CCActionInstant繼承于CCFiniteTimeAction,是一個(gè)瞬間執(zhí)行的動(dòng)作類。即執(zhí)行的動(dòng)作的時(shí)間間隔為零。

    使用方法舉例:

//
	//瞬間翻轉(zhuǎn)Y動(dòng)作
	CCSprite* sp = CCSprite::create("Icon.png");
	CCFlipY* flipY = CCFlipY::create(true); 
	sp->runAction(flipY); 
//

    常用動(dòng)作如下:

//
	//翻轉(zhuǎn)
	CCFlipX::create('是否左右翻轉(zhuǎn)bool');
	CCFlipY::create('是否上下翻轉(zhuǎn)bool');

	//設(shè)置坐標(biāo)
	CCPlace::create('位置CCPoint');

	//顯示、隱藏
	//即:setVisible(),來(lái)設(shè)置可見(jiàn)/不可見(jiàn)
	CCShow::create();
	CCHide::create();

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


2、持續(xù)動(dòng)作CCActionInterval

    CCActionInstant繼承于CCFiniteTimeAction,是一個(gè)持續(xù)執(zhí)行的動(dòng)作類。也就是說(shuō)在一段時(shí)間間隔里,執(zhí)行完成某個(gè)動(dòng)作。

    使用方法舉例:

//
	//1.0秒內(nèi)移動(dòng)到(200,200)
	CCSprite* sp = CCSprite::create("Icon.png");
	CCMoveTo* moveTo = CCMoveTo::create(1.0f, ccp(200, 200)); 
	sp->runAction(moveTo);
//

    常用動(dòng)作如下:

//
/**
 *	關(guān)于To和By:
 *		To:絕對(duì)動(dòng)作。
 *		By:相對(duì)動(dòng)作。
 *
 *	如:當(dāng)前對(duì)象的坐標(biāo)為(20,20)。
 *		CCMoveTo(50,50)后,移動(dòng)到了(50,50)的位置。
 *		CCMoveBy(50,50)后,則是相對(duì)當(dāng)前坐標(biāo)進(jìn)行移動(dòng),最后坐標(biāo)為(70,70)。
 */


/**
 *		移動(dòng)相關(guān)
 */
	//幾秒后移動(dòng)到坐標(biāo)點(diǎn)
	CCMoveTo::create("時(shí)間","坐標(biāo)");
	CCMoveBy::create("時(shí)間","坐標(biāo)");

	//幾秒后經(jīng)過(guò)幾次彈跳到指定位置
	CCJumpTo::create("時(shí)間","目標(biāo)位置","高度","到目標(biāo)所需次數(shù)");
	CCJumpBy::create("時(shí)間","目標(biāo)位置","高度","到目標(biāo)所需次數(shù)");
	
	//幾秒內(nèi)按指定貝塞爾曲線運(yùn)動(dòng)
	CCBezierTo::create("時(shí)間","ccBezierConfig構(gòu)造體");
	CCBezierBy::create("時(shí)間","ccBezierConfig構(gòu)造體");
	
	//幾秒內(nèi)按曲線運(yùn)動(dòng)(擬合度0最柔和)
	CCCardinalSplineTo::create("時(shí)間","控制點(diǎn)坐標(biāo)數(shù)組","擬合度");
	CCCardinalSplineBy::create("時(shí)間","控制點(diǎn)坐標(biāo)數(shù)組","擬合度");

	//幾秒內(nèi)完成一個(gè)樣條插值軌跡(直線)
	CCCatmullRomTo::create("時(shí)間","控制點(diǎn)坐標(biāo)數(shù)組");
	CCCatmullRomBy::create("時(shí)間","控制點(diǎn)坐標(biāo)數(shù)組");

	//幾秒內(nèi)球面運(yùn)動(dòng)
	CCOrbitCamera::create("時(shí)間","起始半徑","半徑差","起始z角","旋轉(zhuǎn)z角","起始x角","旋轉(zhuǎn)x角");


/**
 *		放縮相關(guān)
 */
	//幾秒后縮放到指定大小(1:原大??;大于1:放大;小于1:縮?。?	CCScaleTo::create("時(shí)間","縮放比例");
	CCScaleBy::create("時(shí)間","縮放比例");


/**
 *		旋轉(zhuǎn)相關(guān)
 */
	//幾秒后旋轉(zhuǎn)多少度,單位:角度
	CCRotateTo::create("時(shí)間","角度");
	CCRotateBy::create("時(shí)間","角度");


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


/**
 *		顏色相關(guān)
 */
	//幾秒后變?yōu)橹付≧GB顏色,顏色取值[0,255]
	CCTintTo::create("時(shí)間","紅","綠","藍(lán)");
	CCTintBy::create("時(shí)間","紅","綠","藍(lán)");

	//設(shè)置透明度[0,255](255為不透明)
	CCFadeIn::create("時(shí)間");  //淡入,透明度從0到255
	CCFadeOut::create("時(shí)間"); //淡出,透明度從255到0
	CCFadeTo::create(1.0f,80); //透明度轉(zhuǎn)化為指定值
	
	//幾秒內(nèi)閃爍幾次
	CCBlink::create("時(shí)間","次數(shù)");
//


3、函數(shù)回調(diào)動(dòng)作CCCallFunc

    CCCallFunc也是瞬時(shí)動(dòng)作CCActionInstant的子類。它主要有三種函數(shù)回調(diào)動(dòng)作類。三種函數(shù)回調(diào)的區(qū)別在于所帶的參數(shù)個(gè)數(shù):0、1、2。

//
	CCCallFunc::create('對(duì)象this', '回調(diào)函數(shù)');                   //回調(diào)函數(shù):不帶參數(shù)
	CCCallFuncN::create('對(duì)象this', '回調(diào)函數(shù)');                  //回調(diào)函數(shù):傳遞著本身作為參數(shù)(CCNode* node)
	CCCallFuncND::create('對(duì)象this', '回調(diào)函數(shù)', '任意參數(shù)void'); //回調(diào)函數(shù):帶2個(gè)參數(shù)(CCNode* node,void* a)
//

    使用方法:

//
	//定義函數(shù)回調(diào)動(dòng)作
	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);

	//回調(diào)函數(shù)
	void MyLayer::funback1() { ... }                     //CCCallFunc回調(diào)函數(shù)
	void MyLayer::funback2(CCNode* node) { ... }         //CCCallFuncN回調(diào)函數(shù)
	void MyLayer::funback3(CCNode* node,void* a) { ... } //CCCallFuncND回調(diào)函數(shù)
//


4、組合動(dòng)作

    組合動(dòng)作,顧名思義,就是將單一的動(dòng)作組合起來(lái),形成一個(gè)更加復(fù)雜的動(dòng)作。

    如在移動(dòng)的同時(shí)又進(jìn)行旋轉(zhuǎn),在彈跳后執(zhí)行函數(shù)回調(diào)動(dòng)作等等……

    組合動(dòng)作的類也是CCActionInterval的子類,主要分為兩類:序列動(dòng)作、重復(fù)動(dòng)作。

    (1)序列動(dòng)作:執(zhí)行各個(gè)動(dòng)作的先后順序。

//
	CCSpawn::create("action對(duì)象1", "action對(duì)象2", ..., NULL);    //動(dòng)作同時(shí)執(zhí)行
	CCSequence::create("action對(duì)象1", "action對(duì)象2", ..., NULL); //動(dòng)作按順序執(zhí)行
//

    (2)重復(fù)動(dòng)作:重復(fù)循環(huán)執(zhí)行某一動(dòng)作,當(dāng)然action對(duì)象也可以是序列動(dòng)作。

//
	CCRepeat::create("action對(duì)象","次數(shù)"); //重復(fù)次數(shù)
	CCRepeatForever::create("action對(duì)象"); //無(wú)限重復(fù)
//

    使用方法:

//
	//每次移動(dòng)后閃爍3次,重復(fù)無(wú)限次。
	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、可變速動(dòng)作CCEaseAction

    CCEaseAction也是CCActionInterval的子類。此類動(dòng)作的特點(diǎn)在于動(dòng)作執(zhí)行的過(guò)程中速度是可以變化的。如:CCMoveTo,可以加速或減速的進(jìn)行移動(dòng),也可以先加速再減速的移動(dòng)。

    有該類的存在,是因?yàn)橛螒蛑杏行﹦?dòng)作并不是均勻執(zhí)行的,就像自由落體的球,下落速度會(huì)越來(lái)越快,而不是勻速下落。所以cocos2dx引擎封裝了一些常用的可變速度的類。

    此類速度變化大致可分為三種:

    (1)In   :   由慢變快。

    (2)Out  :   由快變慢。

    (3)InOut:   由慢變快,再變慢。

    其中速度的快慢變化是依據(jù)物理學(xué)上的一些公式進(jìn)行的。如正弦、指數(shù)等等。

    值得注意的是:CCEaseAction變化的是某個(gè)持續(xù)性動(dòng)作action動(dòng)作執(zhí)行過(guò)程中的速度,對(duì)于action動(dòng)作執(zhí)行的時(shí)間依舊是不會(huì)改變的。

    常用的如下:

        其中關(guān)于CCEaseIn、CCEaseOut、CCEaseInOut的變化有點(diǎn)復(fù)雜。具體參照如下文章:

        http://www.cnblogs.com/cocos2d-x/archive/2012/03/15/2398516.html

//
	//線性變化。
	CCEaseIn::create("action對(duì)象", "加速率");     //由慢到快
	CCEaseOut::create("action對(duì)象", "加速率");    //由快到慢
	CCEaseInOut::create("action對(duì)象", "加速率");  //由慢到快再到慢
	
	//正弦變化。
	CCEaseSineIn::create("action對(duì)象");           //由慢到快
	CCEaseSineOut::create("action對(duì)象");          //由快到慢
	CCEaseSineInOut::create("action對(duì)象");        //由慢到快再到慢
	
	//指數(shù)變化。速度的變化按指數(shù)增長(zhǎng)。
	CCEaseExponentialIn::create("action對(duì)象");    //緩慢開(kāi)始
	CCEaseExponentialOut::create("action對(duì)象");   //緩慢結(jié)束
	CCEaseExponentialInOut::create("action對(duì)象"); //緩慢開(kāi)始并緩慢結(jié)束
	
	//反彈變化。類似球碰到地面,不斷落下與反彈。
	CCEaseBounceIn::create("action對(duì)象");         //從起點(diǎn)反彈
	CCEaseBounceOut::create("action對(duì)象");        //從終點(diǎn)反彈		
	CCEaseBounceInOut::create("action對(duì)象");      //起點(diǎn)終點(diǎn)都反彈
	
	//回力變化。類似拉弓、回力標(biāo)。
	CCEaseBackIn::create("action對(duì)象");           //起點(diǎn)作為回力點(diǎn)
	CCEaseBackOut::create("action對(duì)象");          //終點(diǎn)作為回力點(diǎn)
	CCEaseBackInOut::create("action對(duì)象");        //起點(diǎn)終點(diǎn)都作為回力點(diǎn)

	//伸縮式變化。
	CCEaseElasticIn::create("action對(duì)象");        //起點(diǎn)具有彈性
	CCEaseElasticOut::create("action對(duì)象");       //終點(diǎn)具有彈性
	CCEaseElasticInOut::create("action對(duì)象");     //起點(diǎn)終點(diǎn)都具有彈性
//

    使用方法:

//
	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沒(méi)有任何關(guān)系。它既不是瞬時(shí)動(dòng)作,也不是持續(xù)動(dòng)作。從繼承關(guān)系上來(lái)看,它直接繼承于CCAction。

    它的作用是改變持續(xù)動(dòng)作action執(zhí)行的速率,這也就改變了動(dòng)作執(zhí)行所需的時(shí)間。就好比看電影時(shí),覺(jué)得劇情放得太慢,就以兩倍的速度播放。

    使用方法如下:

//
	//以5倍速度執(zhí)行moveBy,執(zhí)行完動(dòng)作只需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、延遲動(dòng)作CCDelayTime

    CCDelayTime是CCActionInterval類。它用于序列動(dòng)作CCSequence中,在兩個(gè)動(dòng)作之間增加一個(gè)等待的時(shí)間段。如:執(zhí)行完移動(dòng)動(dòng)作后,等待3秒,再執(zhí)行閃爍動(dòng)作。

    使用方法如下:

//
	//移動(dòng)后,等待3秒,再執(zhí)行閃爍動(dòng)作
	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、跟隨動(dòng)作CCFollow

    CCFollow也是直接繼承CCAction的一個(gè)子類。它使得某個(gè)CCNode對(duì)象能夠跟隨另一個(gè)CCNode對(duì)象同步移動(dòng)。

    就像如下圖所示,圖層跟精靈圖片同步移動(dòng)。

cocos2dx基礎(chǔ)篇(21)——基本動(dòng)作CCAction

    使用方法:

//
/**
 *		CCFollow::create("跟隨的目標(biāo)對(duì)象", "跟隨的范圍CCRect");
 *		此范圍是限制跟隨對(duì)象的移動(dòng)區(qū)域
 */

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

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

	//創(chuàng)建精靈sp
	CCSprite* sp = CCSprite::create("Icon.png");
	sp->setPosition(ccp(0, 160));
	this->addChild(sp);
	
	//sp執(zhí)行移動(dòng)動(dòng)作,5秒移動(dòng)到(1000,160)
	CCMoveTo* moveTo = CCMoveTo::create(5.0f, ccp(1000, 160));
	sp->runAction(moveTo);

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




【代碼實(shí)戰(zhàn)】

    內(nèi)容太多,請(qǐng)自行實(shí)現(xiàn),可以參考官方TestCpp項(xiàng)目。

    提示:可以多多運(yùn)用組合動(dòng)作,將不同的動(dòng)作組合在一起,可能會(huì)有各種神奇的效果。



向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI