日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2D(九)---- CCAction

發布時間:2025/4/9 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos2D(九)---- CCAction 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前介紹CCNode的時候說過,動作是指在特定時間內完畢移動、縮放、旋轉等操作的行為,節點能夠通過執行動作來實現動畫效果,這里的動作就是指CCAction對象,它有非常多的子類,每一個子類都封裝了不同的動作效果。

先來看看CCAction的繼承結構圖

這里我省略了瞬時動作(CCActionInstant)和間隔動作(CCActionInterval)的子類,由于它們又包括了許多的子類。待會再介紹它們的子類。

CCAction和CCFiniteTimeAction都是抽象類,僅僅定義了一些基本屬性和方法,沒有實際用途。我們須要使用它們的子類來初始化動作。然后執行到節點上。


間隔動作

間隔動作就是指須要經過一段時間才干完畢的動作。全部的間隔動作都繼承自CCActionInterval。

比方CCRotateBy,

能夠在指定時間內旋轉指定的角度

[java]?view plaincopy
  • //?1秒內順時針旋轉360°??
  • CCRotateBy?*rotate?=?[CCRotateBy?actionWithDuration:1?angle:360];??
  • [sprite?runAction:rotate];??

  • 間隔動作的繼承結構圖:(僅僅列出部分經常使用的)


    因為CCActionInterval的子類太多了。這里就不一一介紹了,能夠查閱下API文檔

    以下列舉一下常見的CCActionInterval的子類:

    1.CCBlink

    閃爍效果

    [java]?view plaincopy
  • //?5秒內閃爍20次??
  • CCBlink?*blink?=?[CCBlink?actionWithDuration:5?blinks:20];??
  • [sprite?runAction:blink];??

  • 2.CCMoveBy和CCMoveTo

    CCMoveBy是移動一段固定的距離。CCMoveTo是移動到指定的位置

    [java]?view plaincopy
  • //?在1秒內,向右移動100單位,同一時候向上移動80單位??
  • CCMoveBy?*moveBy?=?[CCMoveBy?actionWithDuration:1?position:CGPointMake(100,?80)];??

  • [java]?view plaincopy
  • //?在1秒內,從節點的當前位置移動到(100,?80)這個位置??
  • 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];??
  • ??
  • //?在1秒內,再順時針旋轉90°。那么sprite的終于旋轉角度是45°?+?90°?=?135°??

  • 假設使用了CCRotateTo
    [java]?view plaincopy
  • CCRotateTo?*rotateTo?=?[CCRotateTo?actionWithDuration:1?angle:90];??
  • [sprite?runAction:rotateTo];??
  • ??
  • //?在1秒內,順時針旋轉到90°。sprite的終于旋轉角度就是90°??

  • 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];??
  • //?在1秒內,寬度和高度再縮小50%,那么sprite終于縮放比例是0.8?*?0.5?=?0.4??

  • 假設使用了CCScaleTo

    [java]?view plaincopy
  • CCScaleTo?*scaleTo?=?[CCScaleTo?actionWithDuration:1?scale:0.5];??
  • [sprite?runAction:scaleTo];??
  • //?在1秒內。寬度和高度縮小為0.5倍,那么sprite終于縮放比例是就0.5??

  • 5.CCFadeIn和CCFadeOut和CCFadeTo

    CCFadeIn是淡入。即由暗轉亮,從沒有到有。CCFadeOut是淡出。即由亮轉暗,從有到沒有;CCFadeTo用來改動節點的不透明度

    [java]?view plaincopy
  • //?在2秒內,從沒有到有??
  • CCFadeIn?*fadeIn?=?[CCFadeIn?actionWithDuration:2];??
  • ??
  • //?在2s內,從有到沒有??
  • CCFadeOut?*fadeOut?=?[CCFadeOut?actionWithDuration:2];??
  • ??
  • //?在2s內,不透明度變為120。即變為半透明?(不透明度取值范圍是0-255)??
  • CCFadeTo?*fadeTo?=?[CCFadeTo?actionWithDuration:2?opacity:120];??

  • 6.CCRepeat

    反復運行某個動作,能夠指定反復的次數

    [java]?view plaincopy
  • //?1秒中順時針旋轉360°??
  • CCRotateBy?*rotateBy?=?[CCRotateBy?actionWithDuration:1?angle:360];??
  • //?反復運行2次旋轉動畫??
  • 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,每隔0.1秒播放下一張圖片??
  • CCAnimation?*animation?=?[CCAnimation?animationWithFrames:frames?delay:0.1];??
  • ??
  • //?依據CCAnimation對象初始化動作??
  • 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];??
  • //?CCTintTo也是CCActionInterval的子類,能夠用于更改精靈的顏色。??
  • ??
  • 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
  • //?移動到(300,?200)??
  • 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];??
  • //?變為紅色后調用self的turnRed方法??
  • CCCallFunc?*fn1?=?[CCCallFunc?actionWithTarget:self?selector:@selector(turnRed)];??
  • ??
  • //?變為綠色??
  • CCTintTo?*tintTo2?=?[CCTintTo?actionWithDuration:2?red:0?green:255?blue:0];??
  • //?變為綠色后調用self的turnGreen:方法。參數是執行當前動作的節點??
  • CCCallFuncN?*fn2?=?[CCCallFuncN?actionWithTarget:self?selector:@selector(turnGreen:)];??
  • ??
  • //?變為藍色??
  • CCTintTo?*tintTo3?=?[CCTintTo?actionWithDuration:2?red:0?green:0?blue:255];??
  • //?變為藍色后調用self的turnBlue:data:方法。第一個參數是執行當前動作的節點,第二個參數是data的值??
  • CCCallFuncND?*fn3?=?[CCCallFuncND?actionWithTarget:self?selector:@selector(turnBlue:data:)?data:@"blue"];??
  • ??
  • //?最后調用turnDone:方法,傳遞了一個@"done"字符串作為參數??
  • 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(@"變為紅色");??
  • }??
  • ??
  • //?node是執行當前動作的節點??
  • -?(void)turnGreen:(id)node?{??
  • ????NSLog(@"變為綠色:%@",?node);??
  • }??
  • ??
  • //?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
  • //?1秒內順時針旋轉360°??
  • CCRotateBy?*rotate?=?[CCRotateBy?actionWithDuration:1?angle:360];??
  • //?使用CCRepeatForever反復CCRotateBy動作??
  • 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
  • //?1秒內順時針旋轉360°??
  • 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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。