2013-02-25 49 views
0

我有一個遊戲,我創建將實例化特定類型的精靈無數次。這個精靈會有一個簡單的循環動畫,因此,我假設我需要利用CCSpriteFrameCacheCCSPriteBatchNode來緩存用於驅動動畫過程的關聯精靈圖像。如何創建一個使用CCSpriteFrameCache&CCSpriteBatchNode對象的CSSprite類?

我一直在閱讀Raywenderlich.com上經常引用的How To Use Animations and Sprite Sheets in Cocos2D,我主要了解這個過程。

我的問題是他包含他的場景文件的代碼中的整個動畫序列。我無法解釋如何將這個相同的代碼放在我創建的子類(CCSprite)中(或類似的類),並在我的遊戲場景中使用這個獨立的精靈。

換句話說,我的願望是有一個CCSprite子類,可以在場景實現中實例化。一些參數被傳遞給子CCSprite的構造函數,並且當精靈被添加到遊戲場景中時,精靈的動畫自動發生並且與任何場景代碼分開。

我該怎麼做? (未)澄清爲什麼我越來越糊塗

在雷的教程的步驟#2的

點,他指示添加用於他的動畫精靈爲self一個孩子CCSpriteBatchNode (這是遊戲場景)。如果我在CCSprite子類實現中定義了CCSpriteBatchNode,我是否需要將CCSpriteBatchNode添加到我的父級場景中?我應該如何(正確)做到這一點?

而且,如果CCSpriteFrameCache是一個單獨的類,它會引起我任何麻煩,在我CCSprite構造函數添加[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"my_sprite.plist"];,或者我應該只用一次這個功能,比如說,在我的應用程序的初始化?

一般來說,我只是困惑。我如何創建一個可以添加(多次)到一個場景的獨立的動畫精靈,而且我的場景不必擔心連線動畫序列,也不會陷入小型iOS處理器?

我真的不在乎我如何解決這個問題。也許我已經提出了一些不正確的假設。只要最終結果如上所述,我願意採取不同的途徑解決這個問題。

謝謝!

+1

我認爲你應該在你的圖層類中做所有的事情,而不是在精靈內部做。 – 2013-02-25 14:05:35

+0

同意,你的主要困惑來自假設你必須創建CCSprite的子類。這也不會改變你使用批處理節點的方式,它仍然會被添加到場景/圖層中,並且你的每個自定義精靈都會添加到它。只要所有精靈的動畫幀都在相同的紋理中(這只是一種很好的做法),就可以將精靈動畫化與精靈批處理完全分離。 – LearnCocos2D 2013-02-25 14:09:15

+0

所以,你告訴我的是我沒有選擇 - 我必須從我的場景(即圖層)管理動畫?!我希望情況不是這樣,但我有點理解。 ( – RLH 2013-02-25 14:15:03

回答

2

實際上,生成的精靈應該是批處理節點的子節點(不是相反的)。批處理節點只是一個用於將繪圖調用「批量化」爲一次調用的小部件:requiremetn是指它的所有子節點(在本例中爲動畫小精靈)源自與批處理節點相同的紋理。您必須使用批處理節點的唯一原因是您計劃從相同紋理獲取多個動畫 - 動畫與批處理節點本身無關。

所以,在你的場景:

  • 創建批處理節點
  • 爲孩子添加批次節點到現場。
  • 創建你想要添加的每個精靈。
    • 您可以擴展CCSprite以在ctor中創建動畫。
    • 如果您希望自己的動畫自行清理,請使用CCSequence(如下所示)。在你的情況下,精靈可能是動畫的精靈1,其中一個動作是CCAnimate動作。
  • 將它們添加到批處理節點。

序列:

CCSprite *icn = [CCSprite spriteWithFile:[NSString stringWithFormat:@"%@_enabled.png", sk.skillIconPrefix]]; 
[icn setBlendFunc:(ccBlendFunc) {GL_SRC_ALPHA, GL_ONE}]; 

icn.opacity = 0; 
id fadein = [CCFadeTo actionWithDuration:.5 opacity:165]; 
id fademax = [CCFadeTo actionWithDuration:.05 opacity:255]; 
id stallmax = [CCDelayTime actionWithDuration:.05]; 
id fadeback = [CCFadeTo actionWithDuration:.05 opacity:165]; 
id stall = [CCDelayTime actionWithDuration:.5]; 
id fadout = [CCFadeTo actionWithDuration:2.5 opacity:0]; 
id clean = [CCCallBlock actionWithBlock:^{ 
    [icn removeFromParentAndCleanup:YES]; 

}]; 

CGPoint pos = [self pointLocationOnMapForLocation:theTile.location]; 
icn.position = ccpAdd(pos, ccp(0, -15)); 
id enchiladas = [CCSequence actions:fadein, fademax, stallmax, fadeback, stall, fadout, clean, nil]; 
[icn runAction:enchiladas]; 

編輯:用於重複動畫(無清除的話),這裏是從我的遊戲之一的示例;

CCAction *forever = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:anim]]; 
+0

)YvesLeBorg:我將不得不在後面嘗試一下,但我想我明白你的建議。一個簡單的問題 - 當我運行Sequence動作時,它會運行在一個循環中嗎?你的代碼看起來像一個run-一次操作 – RLH 2013-02-25 14:32:35

+0

好的,那你就不需要清理了,看看編輯 – YvesLeBorg 2013-02-25 14:56:17

+0

YvesLeBorg:再次感謝你的幫助,我再次看到這個答案,作爲創建一個序列的例子。你剛剛添加的內容來自一個個人項目,只是好奇的是,你在使用這個動畫片段的時候是怎麼使用這個動畫的? – RLH 2013-03-02 03:53:19

相關問題