2011-10-19 58 views
1

我將我的精靈幀添加到CCSpriteFrameCache。然後我用我想要的圖像文件創建一個CCSpriteBatchNode如何正確使用CCSpriteBatchNode?

這是我不太明白:

當我做一個CCSprite,如果我想採取CCSpriteBatchNode的優勢,我需要初始化CCSprite[CCSprite spriteWithBatchNode: rect:]?但如果是這樣的話,我不明白我是如何利用CCSpriteFrameCache來獲取幀的,因爲現在我將手動製作矩形。

所以我想我使用[CCSprite spriteWithSpriteFrameName:]然後我將這個精靈添加到批處理節點。但我仍然不確定。

回答

4

你應該使用:

CCSprite *sp = [CCSprite spriteWithSpriteFrameName:@"monster.png"]; 

您在SpriteFrameCache指定會照顧幀爲您的.plist。 然後創建精靈並添加到批處理中。

如果使用名爲「myArt.png」的文件創建了batchnode,則只能將其添加到「myArt.png」中的精靈。

希望它有幫助!

+0

謝謝。這清除了一切。 – Voldemort

4

根據我所瞭解的cocos2d。 SpriteFrameCache和SpriteBatchNode具有相同的結果,但使用方式不同,如果您的遊戲非常大,則可能會注意到性能差異...

CCSpriteFrameCache根據何時根據plist文件命名它們的幀來加載幀被給了。與plist相關的地圖集也必須添加到項目中,否則將調用框架,但不會繪製任何內容。 Plist就像圖像位於圖像圖集內的地址。 CCSpriteFrameCache的好處在於代碼更整潔,比CCSpriteBatchNode方法小,代價是每次調用該框架時,都會轉到特定的地圖集並繪製它。

另一方面,CCSpriteBatchNode加載圖集並將其加載到一個繪圖調用中。這非常有效,因爲它可以減少遊戲中每次繪製需要完成的次數。這裏唯一的困難是你需要爲地圖集中的每個精靈的矩形做數學運算。這是因爲讓我們說你的地圖集是一個角色的兩個動作,地圖集圖像文件的大小爲1024x1024,每個精靈的大小爲128x128。所以你會做數學來獲得每個矩形的整個跳躍動作例如(這是.plist派上用場避免做這樣的數學)

代碼變得複雜,你可以看到,但它只會做一個電話,使其表現最明智的電話。 另一種使用CCSpriteBatchNode的方法是使用不同的靜態小精靈,並且您只需爲這些多個靜態圖像或精靈繪製調用。

如果你需要示例代碼只是問,我會很樂意提供它。


更新:爲SpriteBatchNode添加鏈接和我自己的示例。

SpriteBatchNode:

Example using SpriteBatchNode with Ray Wenderlich 我相信這個傢伙,我從他的教程瞭解到Cocos2D中的很多。我建議你閱讀他的其他教程。

簡而言之,CCSpriteBatchNode和CCSpriteFrameCache是​​唯一的區別,它將Sprite子節點添加到CCSpriteBatchNode而不是Layer,但是您將CCSpriteBatchNode添加到圖層的過程完全相同。 這是Cocos2d新入門者糾纏在一起的硬性概念。


SpriteFrameCache:

的SpriteFrameCache我無法找到一個很好的例子,所以這裏是一個簡單的問題。

//By doing this your sprites are now in the cache ready to be used 
//by their names declared in the .plist file. 
-(void) loadingSprites:(NSString*) plistName { 
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:plistName]; 

} 

-(id)initGameLayer { 
    //CCSprite accepts CCSpriteFrame and your img is now ready to be displayed. 
    //However is still not drawn yet. 
    CCSprite * mySprite = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:framename]; 


    //set a position if desired 
    //20 pixels to the right and 0 pixels to the top. 
    mySprite.position = CGPointMake(20,0); 

    //Now the Image has been drawn, making 1 draw call. 
    [self addChild:mySprite]; 

} 

值得注意指出CCSpriteBatchNode使得僅有1 drawcall,但是,所有的精靈被添加到batchnode必須是同一SpriteAtlas的一部分。

而且使用SpriteFrameCache只有它更容易和簡單,但對於添加到層每一個孩子就意味着+1繪圖調用正在做(這是不利的一面,性能)

所以,如果你加10個到精靈與SpriteFrameCache的圖層,你將有10個drawcalls。

但是,如果你實現了SpriteBatchNode,並在CCSpriteBatchNode中添加這10個Sprites,而只是將該CCSpriteBatchNode添加到圖層中,那麼您將會添加相同的10個Sprites,但只會進行一次繪製調用。因此,性能差異(對於最好的)在較大的遊戲中將是顯着的。

希望它有幫助,乾杯!

+0

您能否提供CCSpriteBatchNode和CCSpriteFrameCache示例的鏈接? – User42590

+0

當然,讓我剛剛在我的辦公桌上安頓下來,很快就會提供示例鏈接。 –

+0

@ User42590檢查鏈接和我提供的示例,希望我能夠清除您的問題。 –