溫馨提示×

溫馨提示×

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

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

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

發(fā)布時間:2020-07-17 16:27:27 來源:網(wǎng)絡(luò) 閱讀:1004 作者:藍鷗劉輝 欄目:游戲開發(fā)

藍鷗iOS培訓(xùn)講師推薦:本節(jié)內(nèi)容是cocos2dx必備知識,相對來說也比較基礎(chǔ)的:瞬時動作和延時動作。接下來具體講解一下!

一、動作

可以說動作構(gòu)成了cocos2dx的精華(看一下動作類有多少子類就知道了)

動作(指令),指令由節(jié)點執(zhí)行,那么這個節(jié)點在執(zhí)行動作的時候,他的所有子節(jié)點也跟著執(zhí)行,這個特性是非常重要/有用的。

執(zhí)行動作的代碼非常簡單,先生成,然后讓節(jié)點執(zhí)行,程序如下:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

CCAction及其子類的繼承樹非常龐大,這里要逐一介紹了。CCAction及其子類簡圖:

二、CCActionInstant家族(立即動作)

就是動作不用時間,立刻馬上守成。那么立即動作的共同基類分為:CCActionInstant。CCActionInstant的常用子類有:

1、CCFlipX:X軸翻轉(zhuǎn)、CCFlipY:Y軸翻轉(zhuǎn)

2、CCHide:隱藏、CCShow:顯示、CCToggleVisibility:切換可視性

3、CCPlace:放置到一個位置

4、CCCallFunc家族:回調(diào)函數(shù)包裝器

三、CCCallFunc家族(回調(diào)函數(shù)包裝器)

CCCallFunc是CCActionInstant的子類,是非常重要的一個類族(就是適配器)。用大白話說,就是做了一層包裝,把函數(shù)包裝成動作,這樣你在執(zhí)行動作的時候,就可以執(zhí)行函數(shù)了。

玩家死亡動畫(也是個動作)播放完成后,結(jié)束游戲,程序如下:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

//回調(diào)函數(shù)的定義:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

要說的重點是:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

cocos2dx中,一般對象都是采用靜態(tài)方法生成的,函數(shù)簽名如下:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

pSelectorTarget是指這個函數(shù)的執(zhí)行對象,這點不要和動作的執(zhí)行節(jié)點弄混了,是不一樣的,它們兩個是不是一個都行。例如,我用的是this,那么動作的執(zhí)行節(jié)點和函數(shù)的執(zhí)行對象就是同一個。

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

上面是CCCallFunc::execute()的源碼,m_pSelectorTarget就是之前在簽名里綁定的pSelectorTarget,而該動作的執(zhí)行節(jié)點則是另外一個變量m_pTarget

四、使用CCCallFunc家族的類

CCCallFunc家族一共有四個類。這是四個類對象的靜態(tài)生成函數(shù):

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

那么在寫的時候,就直接用這四個生成相關(guān)的動作對象,然后讓節(jié)點執(zhí)行就行。

但是大家一定要注意這四個類,分別對應(yīng)的是四種不同的函數(shù)接口,也可說成是他包裝了四種不一樣的回調(diào)函數(shù)。這四個回調(diào)函數(shù)的不一樣,主要是因為參數(shù)表的不一樣。下面是四個回調(diào)函數(shù)的型定義,看一下:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

這四個玩意要解釋清楚比較麻煩,這是用typedef定義了類成員函數(shù)指針。如果你對C++不熟悉,你不需要搞懂具體什么意思,但你必須保證你的函數(shù)簽名和這四個其中之一一致。

意思就是自己寫的回調(diào)函數(shù)簽名,看起來像這樣:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

你可以在回調(diào)函數(shù)里操作這些被傳進來的參數(shù)。

除此之外,在用靜態(tài)函數(shù)生成動作的時候,要用一個宏,幫助轉(zhuǎn)換函數(shù)指針類型,上面那個callfunc_selector,因為有四種類型的回調(diào)函數(shù),所以也就有四個類型轉(zhuǎn)換宏

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

最后出來的的程序應(yīng)該是:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

五、CCActionInterval家族(持續(xù)動作)

就是該動作的執(zhí)行將持續(xù)一段時間。因此持續(xù)動作的靜態(tài)生成函數(shù),往往附帶一個時間值Duration。如下:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

持續(xù)動作類名后綴:分為To和By。To表示最終達到的目標值,By表示增量值。如:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

持續(xù)動作比立即動作的數(shù)量要多很多,常用的CCActionInterval子類動作有,簡單的表現(xiàn):

1、CCMoveTo:移動到、CCMoveBy:按……移動

2、CCJumpTo:跳躍到、CCJumpBy:按……跳躍

3、CCBezierTo:貝茲移動到、CCBezierBy:按……貝茲移動

4、CCRotateTo:旋轉(zhuǎn)到、CCRotateBy:按……旋轉(zhuǎn)
5、CCScaleTo:縮放到、CCScaleBy:按……縮放
6、CCSkewTo:切變到、CCSkewBy:按……切變

7、CCTintTo:顏色漸變到、CCTintBy:按……顏色漸變

8、CCFadeIn:從無到有,也叫淡入、CCFadeOut:從有到無,也叫淡出、CCFadeTo:改變不透明度到某個值

9、CCBlink:閃耀

10、CCDelayTime:延時復(fù)雜一點的:

1、CCAnimate:幀動畫,這個我們在第四節(jié)講過,關(guān)于動畫的問題不是一句兩句就能說完,以后會慢慢展開

2、CCGridAction家族:網(wǎng)格動畫

3、包裝器:CCRepeat:重復(fù)執(zhí)行幾次、CCRepeatForever:永遠執(zhí)行、CCSequence:按序列執(zhí)行、CCSpawn:同時執(zhí)行、CCActionEase家族:補間動畫

六、簡單的持續(xù)動作

這些動作都非常簡單,和立即動作的區(qū)別只是增加了一個執(zhí)行時間而已。但還有一些要注意的地方:

1、旋轉(zhuǎn)動作順時針是正方向

2、關(guān)于貝茲曲線

貝茲曲線的描述結(jié)構(gòu)體如下:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

如果執(zhí)行節(jié)點是this的話,那么對應(yīng)個點的位置如圖。

注意,當使用CCBezierTo時,ccBezierConfig的點都是絕對坐標點。但如果使用CCBezierBy,ccBezierConfig的點都是相對坐標點。這點要謹記。

七、一些包裝器

這些動作單獨無法起作用,需要包裝其他動作類才行。他們的作用是對于動作的執(zhí)行,增加一些變化。和裝飾者模式相相近,看起來一樣。

1、CCRepeat:用于重復(fù)執(zhí)行幾次動作,times表示執(zhí)行次數(shù)

staticCCRepeat*CCRepeat::actionWithAction(CCFiniteTimeAction*pAction,unsignedinttimes)

使用舉例:在我的例子中,用到如下寫法,我播放一個詐彈動畫若干次,然后啟動爆炸的相關(guān)代碼。

CCFiniteTimeAction*action=getAnimate();//獲得詐彈播放動畫,自己實現(xiàn)的函數(shù)

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

2.CCRepeatForever:永遠執(zhí)行一個動作

staticCCRepeatForever*CCRepeatForever::actionWithAction(CCActionInterval*pAction)

如:一個精靈我只會改變他的位置,但是不需要改變他的動畫,那么就可以使用這個來保持這個動畫一直運行,代碼如下:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

3.CCSequence:按序列執(zhí)行動作,這會讓節(jié)點連續(xù)執(zhí)行幾個動作。

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

例如:執(zhí)行一個動作,然后回調(diào)。比如主角行走一個格子后,切換為站立狀態(tài)。代碼如下:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

但是大家一定要注意,最后要使用NULL結(jié)尾。表示傳參結(jié)束。我不明白為什么非要強制加NULL,按道理說C++不定參數(shù)表,可以不用NULL的。看源代

碼才發(fā)現(xiàn),里面用到了真值判斷刷循環(huán)。

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

4.CCSpawn:同時執(zhí)行幾個動作,最終動作的持續(xù)時間,由時間最長的那個動作確定。

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

例如:可以用CCSpacwn來做翻跟頭的動畫,只需要組合moveTo和RotateBy。Test中有這個代碼:

iOS開發(fā)篇——cocos2d-x 瞬時動作延時動作

八、fan動作

fan動作是使用一個接口實現(xiàn)的,該接口直接返回一個此動作的fan動作。

virtualCCFiniteTimeAction*reverse(void)

例如:fan動作很容易造出一個動作循環(huán)來,在Test中有這個代碼,大家可以參考一下:

CCActionInterval*jump=CCJumpBy::actionWithDuration(2,CCPointMake(300,0),50,4);
CCFiniteTimeAction*action=CCSequence::actions(jump,jump->reverse(),NULL);
m_grossini->runAction(action);

是不是感覺好復(fù)雜?。∑鋵崒W(xué)起來一點都不復(fù)雜,是比較基礎(chǔ)的,相對來說比較簡單,只要有基礎(chǔ)就更不是問題了。

向AI問一下細節(jié)

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

AI