1

これが可能かどうかはわかりませんが、1 つの大きなテクスチャ アトラスを作成し、それをアプリケーションのすべてのクラスで使用したいと考えています。

1 つの CCSpriteBatchNode を複数のクラスに使用できますか?

メインクラスでこれを作成するとします

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"atlasGeral.plist"];
self.batchNodeGeneral = [CCSpriteBatchNode batchNodeWithFile:@"atlasGeral.png"];
[self addChild:self.batchNodeGeneral];

次のように、CCSpriteBatchNode を使用する前に、初期化されたメイン クラスで CCLayers を作成する別のクラスがあります。

-(id) init 
{

   if( (self=[super init])) {

        self.bg = [CCSprite spriteWithFile: @"cCircularBG.png"];
        [self addChild:self.bg];

        self.dr = [CCSprite spriteWithFile: @"cCircularDR.png"];
        [self addChild:self.dr];      
  }
  return self;  // self is a CCLayer
}

これは、メイン クラスの self.batchNodeGeneral を使用して最適化できますか? 私の考えは、これら 2 つのスプライトと他のスプライトを[CCSprite spriteWithSpriteFrameName:...]のようなものに置き換えることです。

ありがとう

4

1 に答える 1

5

私が従うかどうかは完全にはわかりませんが、答えはイエスだと確信しています。

CCSpriteBatchNodeはクラスとは何の関係もありません、それはアセットと関係があります。バッチノードの使用に関する重要な制限は、バッチ内のすべてのスプライトが同じテクスチャアトラスを参照する必要があることです。したがって、アプリケーション全体に1つのバッチノードを設定し、すべてのゲームプレイクラスに独自のスプライトをそのバッチに追加させることはまったく問題ありません。テクスチャアトラスがターゲットハードウェアの最大テクスチャサイズよりも大きくなると、これは実際的な問題になる可能性があります(詳細については、iOSデバイスの仕様を参照してください)が、グローバルバッチと多数のアセットが必要な場合は、作成するのはそれほど難しくありません。テクスチャIDでインデックス付けされたバッチプールで、アトラスごとに1つのバッチノードを作成し、新しいスプライトを作成するたびに、それを適切なバッチに追加します。

正直なところ、バッチノード全体がCocos2Dの部分にひどい恨みを持っているように感じます。これは、効率を維持しながら開発者に対してほぼ完全に透過的にすることができますが、レンダリングを掘り下げていないため、この意見は完全に公平ではないかもしれません。彼らの動機を理解するためのコード。深さの並べ替えがどのように機能するかなどの期待に混乱するだろうと思いますが、レンダリング用のオブジェクトのバッチ処理がプログラマーの責任になる理由はわかりません。エンジンで行う必要があります。

編集して可能な解決策を追加します。

-(id) initWithMainClass:(MainClass*)mc
{

   if( (self=[super init])) {

        self.bg = [CCSprite spriteWithSpriteFrameName: @"cCircularBG.png"];
        [mc.batchNodeGeneral addChild:self.bg];

        self.dr = [CCSprite spriteWithSpriteFrameName: @"cCircularDR.png"];
        [mc.batchNodeGeneral addChild:self.dr];      
  }
  return self;  // self is a CCLayer
}
`

したがって、他のクラスの1つを初期化するときは、メインクラスインスタンスをパラメータとして渡して、そのフィールドにアクセスできるようにします。または、メイン/マネージャークラスをシングルトンにするか、ニーズに適した別のアーキテクチャを見つけます。

于 2012-06-09T20:10:47.350 に答える