2011-10-19 5 views
1

スプライトフレームをCCSpriteFrameCacheに追加します。それから私は希望のイメージファイルでCCSpriteBatchNodeを作成します。CCSpriteBatchNodeの使い方は?

これは、私はかなり理解していないものです:

を私はCCSpriteを作るとき、私はCCSpriteBatchNodeを利用したい場合は、私が[CCSprite spriteWithBatchNode: rect:]CCSpriteを初期化する必要がありますか?しかし、そうであれば、フレームを取得するために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は、アトラスをロードして1回の描画呼び出しでロードします。これは、ゲームで必要に応じてドローが行われなければならない時間を減らすので効率的です。唯一の難点は、アトラスの各スプライトの四角形の計算を行う必要があることです。これは、あなたのアトラスが文字の2つのアクションであり、アトラス画像ファイルのサイズが1024x1024で、各スプライトのサイズが128x128であるためです。だから、ジャンプアクション全体の各矩形を得るために数学をやることになります(これは、このような数学を避けるために便利です。 1回のコールで、パフォーマンスに賢明なコールを発信します。 CCSpriteBatchNodeを使用する別の方法は、異なる静的スプライトを持つことです。複数の静的イメージまたはスプライトに対して1回の描画呼び出しを行うだけです。

サンプルコードが必要な場合は、私はそれを提供して喜んでいるでしょう。


更新:SpriteBatchNodeへのリンクの追加と私自身の例。

SpriteBatchNode:

Example using SpriteBatchNode with Ray Wenderlich 私はこの男を信じて、私は彼のチュートリアルからCocos2dの多くを学びました。他のチュートリアルを読むことをお勧めします。

簡潔に言えば、CCSpriteBatchNodeは、CCSpriteFrameCacheを使用した場合とまったく同じプロセスであり、CCSpriteBatchNodeをレイヤーではなくCCSpriteBatchNodeに追加するのと同じですが、レイヤーにCCSpriteBatchNodeを追加します。 これは、Cocos2dの新しい人たちが絡み合うという難しいコンセプトです。


SpriteFrameCache:私はここで良い例を見つけることができませんでした

SpriteFrameCacheは1単純なものです。

//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]; 

} 

しかしbatchnodeに追加されているすべてのスプライトが同じSpriteAtlasの一部でなければならない、CCSpriteBatchNodeはちょうど1 drawcallを作ることを指摘することは注目に値します。

そしてSpriteFrameCacheを使用してのみ、その簡単かつシンプルな、しかし、すべての子供が、それは+1ドローコールが行われていることを意味層に添加のため。(これは、パフォーマンスの欠点である)

だからあなたは10個のスプライトを追加した場合SpriteFrameCacheのレイヤーには10個のdrawcallsがあります。

しかし、SpriteBatchNodeを実装し、その10個のスプライトをCCSpriteBatchNodeに追加し、そのレイヤにCCSpriteBatchNodeを追加すると、同じ10個のスプライトが追加されますが、1回の描画呼び出しだけが行われます。したがって、パフォーマンスの差(最高の場合)は、より大きなゲームでは重要になります。

希望する、乾杯!

+0

CCSpriteBatchNodeとCCSpriteFrameCacheの例のリンクを提供してください。 – User42590

+0

ちょうど私の机の上に落ち着きましょう、すぐに例へのリンクをすぐに提供してください。 –

+0

@ User42590リンクと私が提供した例をチェックして、うまくいけばあなたの質問をクリアすることができました。 –

関連する問題