取材自:Learning Cocos2D
之前看書時一直沒分清楚CCAnimation和CCAnimate的差別,現在搞懂了,一個專門儲存用來播放動畫的frame或Sprite,一個是用來設定動畫,像是延遲時間之類的。
CCAnimation是儲存動畫的素材,像是sprite或是frame。
CCAnimate是製作動畫的類,比方說設定時間或倒轉動畫,指定要執行動畫的CCAnimation後便可執行。
CCAnimationCache單例:可以cache你所有的動畫。一般來說,使用CCAnimation製作動畫的話,是將動畫儲存成實例變數,但用這個的話你可以把CCAnimaiton都存到裡面,需要的時候再取回。比方說你有很多需要執行同樣動畫的sprites,那這個方法就很方便。但使用的時候有兩件事情要注意:
1. 當取回動畫時,你要檢查該動畫不是nil。透過purgeSharedAnimationCache,CCAnimaitonCache會移除動畫。如果你要求的動畫不再被儲存(cached),那就會返回nil。
2. 任何你希望保存的動畫都要去維持(retain),這樣的話就算這些動畫從CCAniamtionCache中被移除時,你的物件還是可以取得該CCAnimate。
使用 CCAnimationCache的方法:將你已經創造的動畫加到CCAnimationCache,如下
[[ CCAnimationCache sharedAnimationCache] addAnimation: animationToCache name: @" AnimaitonName "];
CCAnimaiton要呼叫的animationToCache現在已經儲存在CCAnimationCache單例裡面,當你想去使用被儲存的動畫時,你可以如此取回
CCAnimation *myAnimation = [[ CCAnimationCache sharedAnimationCache] animationByName:@"AnimationName"];
另外就是,如果你的sprite是來自於CCSpriteBatchNode,那code需要稍微改一下。
CCAnimaiton *exampleAnim = [ CCAnimation animation];
[ exampleAnim addFrame: [[ CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName : @" XXX.png "]];
id animateAction = [ CCAnimate ….someAnimations….];
[ spriteFromeBatchNode actionWithAction : exampleAnim];
其實還有一個很重要的類要講一下,就是CCSpriteBatchNode。簡單舉例來說,你要在畫面上渲染一個Sprite時,那很簡單,可是你要在畫面上渲染一百個一樣的Sprites的話,那編譯器要執行一百次同樣的步驟,你認為這會不會花很多時間?CCSpriteBatchNode就是他幫你一次做完這一百次的呼叫,講的簡單一點就是這樣。比方說大家幾乎都玩過的三國無雙,裡面常常一出現就是七八十隻小兵,一個一個做出來一定超花時間,可是用這方法,都可以一次就做完全部的呼叫,效能自然大大提升啦!之後我讀清楚一點後再分享一篇出來好好解釋一下這個類吧。
之前看書時一直沒分清楚CCAnimation和CCAnimate的差別,現在搞懂了,一個專門儲存用來播放動畫的frame或Sprite,一個是用來設定動畫,像是延遲時間之類的。
CCAnimation是儲存動畫的素材,像是sprite或是frame。
CCAnimate是製作動畫的類,比方說設定時間或倒轉動畫,指定要執行動畫的CCAnimation後便可執行。
CCAnimationCache單例:可以cache你所有的動畫。一般來說,使用CCAnimation製作動畫的話,是將動畫儲存成實例變數,但用這個的話你可以把CCAnimaiton都存到裡面,需要的時候再取回。比方說你有很多需要執行同樣動畫的sprites,那這個方法就很方便。但使用的時候有兩件事情要注意:
1. 當取回動畫時,你要檢查該動畫不是nil。透過purgeSharedAnimationCache,CCAnimaitonCache會移除動畫。如果你要求的動畫不再被儲存(cached),那就會返回nil。
2. 任何你希望保存的動畫都要去維持(retain),這樣的話就算這些動畫從CCAniamtionCache中被移除時,你的物件還是可以取得該CCAnimate。
使用 CCAnimationCache的方法:將你已經創造的動畫加到CCAnimationCache,如下
[[ CCAnimationCache sharedAnimationCache] addAnimation: animationToCache name: @" AnimaitonName "];
CCAnimaiton要呼叫的animationToCache現在已經儲存在CCAnimationCache單例裡面,當你想去使用被儲存的動畫時,你可以如此取回
CCAnimation *myAnimation = [[ CCAnimationCache sharedAnimationCache] animationByName:@"AnimationName"];
另外就是,如果你的sprite是來自於CCSpriteBatchNode,那code需要稍微改一下。
CCAnimaiton *exampleAnim = [ CCAnimation animation];
[ exampleAnim addFrame: [[ CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName : @" XXX.png "]];
id animateAction = [ CCAnimate ….someAnimations….];
[ spriteFromeBatchNode actionWithAction : exampleAnim];
其實還有一個很重要的類要講一下,就是CCSpriteBatchNode。簡單舉例來說,你要在畫面上渲染一個Sprite時,那很簡單,可是你要在畫面上渲染一百個一樣的Sprites的話,那編譯器要執行一百次同樣的步驟,你認為這會不會花很多時間?CCSpriteBatchNode就是他幫你一次做完這一百次的呼叫,講的簡單一點就是這樣。比方說大家幾乎都玩過的三國無雙,裡面常常一出現就是七八十隻小兵,一個一個做出來一定超花時間,可是用這方法,都可以一次就做完全部的呼叫,效能自然大大提升啦!之後我讀清楚一點後再分享一篇出來好好解釋一下這個類吧。
留言
張貼留言