之前介紹CCNode的時候說過,動作是指在特定時間內完畢移動、縮放、旋轉等操作的行為,節點能夠通過執行動作來實現動畫效果,這里的動作就是指CCAction對象,它有非常多的子類,每一個子類都封裝了不同的動作效果。
先來看看CCAction的繼承結構圖
這里我省略了瞬時動作(CCActionInstant)和間隔動作(CCActionInterval)的子類,由于它們又包括了許多的子類。待會再介紹它們的子類。
CCAction和CCFiniteTimeAction都是抽象類,僅僅定義了一些基本屬性和方法,沒有實際用途。我們須要使用它們的子類來初始化動作。然后執行到節點上。
間隔動作
間隔動作就是指須要經過一段時間才干完畢的動作。全部的間隔動作都繼承自CCActionInterval。比方CCRotateBy,
能夠在指定時間內旋轉指定的角度
[java]?view plaincopy
?? CCRotateBy?*rotate?=?[CCRotateBy?actionWithDuration:1?angle:360];?? [sprite?runAction:rotate];??
間隔動作的繼承結構圖:(僅僅列出部分經常使用的)
因為CCActionInterval的子類太多了。這里就不一一介紹了,能夠查閱下API文檔
以下列舉一下常見的CCActionInterval的子類:
1.CCBlink
閃爍效果
[java]?view plaincopy
?? CCBlink?*blink?=?[CCBlink?actionWithDuration:5?blinks:20];?? [sprite?runAction:blink];??
2.CCMoveBy和CCMoveTo
CCMoveBy是移動一段固定的距離。CCMoveTo是移動到指定的位置
[java]?view plaincopy
?? CCMoveBy?*moveBy?=?[CCMoveBy?actionWithDuration:1?position:CGPointMake(100,?80)];?? [java]?view plaincopy
?? CCMoveTo?*moveTo?=?[CCMoveTo?actionWithDuration:1?position:CGPointMake(100,?80)];??
3.CCRotateBy和CCRotateTo
CCRotateBy是在當前旋轉角度的基礎上再旋轉固定的角度。CCRotateTo是從當前旋轉角度旋轉到指定的角度
如果精靈在初始化的時候已經順時針旋轉了45°
[java]?view plaincopy
sprite.rotation?=?45;??
假設使用了CCRotateBy
[java]?view plaincopy
CCRotateBy?*rotateBy?=?[CCRotateBy?actionWithDuration:1?angle:90];?? [sprite?runAction:rotateBy];?? ?? ?? 假設使用了CCRotateTo [java]?view plaincopy
CCRotateTo?*rotateTo?=?[CCRotateTo?actionWithDuration:1?angle:90];?? [sprite?runAction:rotateTo];?? ?? ??
4.CCScaleBy和CCScaleTo
CCScaleBy是在當前縮放比例的基礎上再縮放固定的比例。CCScaleTo是從當前縮放比例縮放到指定的比例
如果精靈在初始化的時候的縮放比例為0.8
[java]?view plaincopy
sprite.scale?=?0.8;?? 假設使用了CCScaleBy [java]?view plaincopy
CCScaleBy?*scaleBy?=?[CCScaleBy?actionWithDuration:1?scale:0.5];?? [sprite?runAction:scaleBy];?? ?? 假設使用了CCScaleTo
[java]?view plaincopy
CCScaleTo?*scaleTo?=?[CCScaleTo?actionWithDuration:1?scale:0.5];?? [sprite?runAction:scaleTo];?? ??
5.CCFadeIn和CCFadeOut和CCFadeTo
CCFadeIn是淡入。即由暗轉亮,從沒有到有。CCFadeOut是淡出。即由亮轉暗,從有到沒有;CCFadeTo用來改動節點的不透明度
[java]?view plaincopy
?? CCFadeIn?*fadeIn?=?[CCFadeIn?actionWithDuration:2];?? ?? ?? CCFadeOut?*fadeOut?=?[CCFadeOut?actionWithDuration:2];?? ?? ?? CCFadeTo?*fadeTo?=?[CCFadeTo?actionWithDuration:2?opacity:120];??
6.CCRepeat
反復運行某個動作,能夠指定反復的次數
[java]?view plaincopy
?? CCRotateBy?*rotateBy?=?[CCRotateBy?actionWithDuration:1?angle:360];?? ?? CCRepeat?*repeat?=?[CCRepeat?actionWithAction:rotateBy?times:2];?? ?? [sprite?runAction:repeat];??
7.CCAnimate
按順序地播放圖片。能夠實現幀動畫。
比如有下面10張圖片:(玩過街機的同學應該非常熟悉。趙云的大鵬展翅)
不難發現,如果從1.png 到 10.png按順序顯示圖片的話會形成一個動畫
以下用CCAnimate實現動畫效果
[java]?view plaincopy
?? NSMutableArray?*frames?=?[NSMutableArray?array];?? ?? for?(int?i?=?1;?i<=?10;?i++)?{?? ?????? ????NSString?*name?=?[NSString?stringWithFormat:@"zy.bundle/%i.png",?i];?? ?????? ????CCTexture2D?*texture?=?[[CCTextureCache?sharedTextureCache]?addImage:name];?? ?????? ????CGRect?retct?=?CGRectMake(0,?0,?texture.contentSize.width,?texture.contentSize.height);?? ????CCSpriteFrame?*frame?=?[[[CCSpriteFrame?alloc]?initWithTexture:texture?rect:retct]?autorelease];?? ?????? ????[frames?addObject:frame];?? }?? ?? ?? CCAnimation?*animation?=?[CCAnimation?animationWithFrames:frames?delay:0.1];?? ?? ?? CCAnimate?*animate?=?[CCAnimate?actionWithAnimation:animation];?? ?? [sprite?runAction:animate];?? 動畫效果例如以下:
這里是將10幀分為10張不同的png圖片。為了性能著想。事實上最好將10幀打包成一個圖片。到時從這張圖片上面分割每一幀,這樣的圖片我們能夠稱為"紋理相冊"。能夠用TexturePacker制作紋理相冊
8.CCSequence
普通情況下,假設給節點同一時候加入幾個動作時,它們會同一時候執行。
比方以下的代碼效果是一邊旋轉一邊縮放
[java]?view plaincopy
CCRotateBy?*rotateBy?=?[CCRotateBy?actionWithDuration:1?angle:360];?? CCScaleBy?*scaleBy?=?[CCScaleBy?actionWithDuration:1?scale:2];?? ?? [sprite?runAction:rotateBy];?? [sprite?runAction:scaleBy];?? 可是有時候我們想讓動作一個接著一個執行,那么就要用到CCSequence以下演示的效果是。讓精靈先變為紅色,再從紅色變為綠色。再從綠色變為藍色
[java]?view plaincopy
CCTintTo?*tintTo1?=?[CCTintTo?actionWithDuration:1?red:255?green:0?blue:0];?? CCTintTo?*tintTo2?=?[CCTintTo?actionWithDuration:1?red:0?green:255?blue:0];?? CCTintTo?*tintTo3?=?[CCTintTo?actionWithDuration:1?red:0?green:0?blue:255];?? ?? ?? CCSequence?*sequence?=?[CCSequence?actions:tintTo1,?tintTo2,?tintTo3,?nil];?? [sprite?runAction:sequence];?? CCSequence會按順序運行參數中傳入的全部動作
9.CCActionEase
當對節點使用CCMoveTo動作時,它會勻速移動到目的地,假設使用CCActionEase就能夠使節點由慢到快或者由快到慢地移向目的地。因此CCActionEase是用來改變動作的執行時速度的。
CCActionEase是個很強大的類,子類許多。這里僅僅說明當中的幾個:
CCEaseIn:由慢到快
CCEaseOut:由快到慢
CCEaseInOut:先由慢到快,再由快到慢
舉個代碼樣例:
[java]?view plaincopy
CCMoveTo?*moveTo?=?[CCMoveTo?actionWithDuration:4?position:ccp(300,?200)];?? CCEaseInOut?*easeInOut?=?[CCEaseInOut?actionWithAction:moveTo?rate:5];?? [sprite?runAction:easeInOut];?? 你會看到精靈先由慢到快,再由快到慢。rate參數決定了速率變化的明顯程度,當它大于1時才有效
10.CCGridAction
使用CCGridAction的詳細子類能夠實現三維效果。比如翻頁效果(CCPageTurn3D)、波浪效果(CCWaves)、流體效果(CCLiquid)。盡管能實現非常好看的3D效果。可是它有非常大的缺點。假設不啟用深度緩沖。3D效果會有些失真,假設啟用了深度緩沖,會特別耗內存。
假設想開啟深度緩沖的話。就要改動EAGLView的初始化參數depthFormat:
[java]?view plaincopy
EAGLView?*glView?=?[EAGLView?viewWithFrame:[window?bounds]?? ???????????????????????????????????pixelFormat:kEAGLColorFormatRGB565????? ???????????????????????????????????depthFormat:GL_DEPTH_COMPONENT24_OES];?? 能夠改為GL_DEPTH_COMPONENT16_OES(16位深度緩沖)或者GL_DEPTH_COMPONENT24_OES(24位深度緩沖)。16位深度緩沖占用的內存較少。可是仍然會有些失真
瞬時動作
瞬時動作(CCActionInstant)是指可以瞬間完畢的動作。可用于改變節點位置、翻轉節點形成鏡像、設置節點的可視性等。
以下大致看下瞬時動作的繼承結構圖:
看完這個圖,你可能認為CCActionInstant好像沒有一點使用價值。由于它的好多動作都能夠通過改動節點屬性來完畢。
比方能夠通過設置節點的visible屬性來取代使用CCShow\CCHide\CCToggleVisibility、能夠通過改動節點的position屬性來取代使用CCPlace。事實上當它們與CCSequence結合使用時才有價值。比方,我們想先讓節點執行一個CCMoveTo移動到某個位置,移動完畢后再隱藏節點,這時候我們就能夠將CCMoveTo、CCHide兩個動作按順序放進CCSequence中達到想要的效果。
[java]?view plaincopy
?? CCMoveTo?*moveTo?=?[CCMoveTo?actionWithDuration:2?position:ccp(300,?200)];?? ?? CCHide?*hide?=?[CCHide?action];?? ?? CCSequence?*sequence?=?[CCSequence?actions:moveTo,?hide,?nil];?? ?? [sprite?runAction:sequence];?? 有時候。在一個動作序列(CCSequence)里面。我們須要在一個動作運行完畢后,調用某個方法運行一些操作,然后再運行下一個動作。那我們就能夠
結合CCCallFunc和CCSequence完畢這個功能。
比方,我們讓精靈先變為紅色,再從紅色變為綠色,再從綠色變為藍色。并且在每次變換顏色后都調用某個方法運行一些操作:
[java]?view plaincopy
?? CCTintTo?*tintTo1?=?[CCTintTo?actionWithDuration:2?red:255?green:0?blue:0];?? ?? CCCallFunc?*fn1?=?[CCCallFunc?actionWithTarget:self?selector:@selector(turnRed)];?? ?? ?? CCTintTo?*tintTo2?=?[CCTintTo?actionWithDuration:2?red:0?green:255?blue:0];?? ?? CCCallFuncN?*fn2?=?[CCCallFuncN?actionWithTarget:self?selector:@selector(turnGreen:)];?? ?? ?? CCTintTo?*tintTo3?=?[CCTintTo?actionWithDuration:2?red:0?green:0?blue:255];?? ?? CCCallFuncND?*fn3?=?[CCCallFuncND?actionWithTarget:self?selector:@selector(turnBlue:data:)?data:@"blue"];?? ?? ?? CCCallFuncO?*fn4?=?[CCCallFuncO?actionWithTarget:self?selector:@selector(turnDone:)?object:@"done"];?? ?? CCSequence?*sequence?=?[CCSequence?actions:tintTo1,?fn1,?tintTo2,?fn2,?tintTo3,?fn3,?fn4,?nil];?? [sprite?runAction:sequence];?? 以下是回調方法的實現:
[java]?view plaincopy
-?(void)turnRed?{?? ????NSLog(@"變為紅色");?? }?? ?? ?? -?(void)turnGreen:(id)node?{?? ????NSLog(@"變為綠色:%@",?node);?? }?? ?? ?? -?(void)turnBlue:(id)node?data:(void?*)data?{?? ????NSLog(@"變為藍色。%@。%@",?node,?data);?? }?? ?? -?(void)turnDone:(id)param?{?? ????NSLog(@"變換完成:%@",?param);?? }?? 你會發現,精靈變為紅色后就會調用turnRed方法,變為綠色后會調用turnGreen:方法,變為藍色后會先調用turnBlue:data:方法,最后調用turnDone:方法
最后做一個總結:
以下這幾個類都會在執行動作時調用一個方法
CCCallFunc :調用方法時不傳遞參數
CCCallFuncN :調用方法時,能夠傳遞1個參數,參數值是執行當前動作的節點
CCCallFuncND :調用方法時,能夠傳遞2個參數,第1個參數是執行當前動作的節點。第2個參數是actionWithTarget:selector:data:方法中的data值
CCCallFuncO :調用方法時。能夠傳遞1個參數,參數值是actionWithTarget:selector:object:方法中的object值
CCRepeatForever
CCRepeatForever直接繼承自CCAction,能夠不停地執行某個間隔動作(CCActionInterval)。
假設你想讓精靈不停地旋轉,能夠這樣寫:
[java]?view plaincopy
?? CCRotateBy?*rotate?=?[CCRotateBy?actionWithDuration:1?angle:360];?? ?? CCRepeatForever?*repeat?=?[CCRepeatForever?actionWithAction:rotate];?? [sprite?runAction:repeat];?? 也可以利用CCRepeatForever反復一個動作序列(CCSequence)
[java]?view plaincopy
?? CCTintTo?*tintTo1?=?[CCTintTo?actionWithDuration:1?red:255?green:0?blue:0];?? ?? CCTintTo?*tintTo2?=?[CCTintTo?actionWithDuration:1?red:0?green:255?blue:0];?? ?? CCTintTo?*tintTo3?=?[CCTintTo?actionWithDuration:1?red:0?green:0?blue:255];?? CCSequence?*sequence?=?[CCSequence?actions:tintTo1,?tintTo2,?tintTo3,?nil];?? ?? CCRepeatForever?*repeat?=?[CCRepeatForever?actionWithAction:sequence];?? ?? [sprite?runAction:repeat];?? 你會發現精靈的顏色狀態是:紅 -> 綠 -> 藍 -> 紅 -> 綠 -> 藍 -> 紅 ...,一直在紅綠藍3種顏色之間按順序切換
CCSpeed
CCSpeed也是直接繼承自CCAction,能夠影響間隔動作(繼承自CCActionInterval的動作)的執行速度。
[java]?view plaincopy
?? CCRotateBy?*rotate?=?[CCRotateBy?actionWithDuration:1?angle:360];?? ?? CCSpeed?*speed?=?[CCSpeed?actionWithAction:rotate?speed:0.5];?? [sprite?runAction:speed];?? 本來1秒就完畢旋轉的,設置speed為0.5后,就須要2秒才干完畢旋轉
原文地址:http://blog.csdn.net/q199109106q/article/details/8604436
感謝作者~!
轉載于:https://www.cnblogs.com/hrhguanli/p/4825431.html
總結
以上是生活随笔為你收集整理的cocos2D(九)---- CCAction的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。