0

サブクラス化された CCNode があり、そこに同じ小さなサブクラス化された CCSprite がいくつか追加され、サブクラス化されたスプライトの子がいくつかあります。私は CCSpriteBatchNode を適切に使用していると思っていましたが、何百もの描画呼び出しが登録されていることに気付き、これは 1 つだけであるべきだと思いました。

私の CCNode サブクラスはこの子を追加します:

Segment* segment = [Segment segmentWithState:kState];
[self addChild:segment];

セグメントは、次の CCSprite のサブクラスです。

+(id) segmentWithState:(SegmentState)segmentState { return [[self alloc] initWithState:segmentState];}

-(id) initWithState:(SegmentState)theSegmentState {

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

    self = [super initWithSpriteFrameName:theSegmentStateFrameName];
    if (self){
        Subsegment * subsegment = [Subsegment subsegmentWithState:kInvisible];
    } 
    return self;

次に、このセグメント サブクラスは、同じコードを持つサブクラス サブセグメントの子を取得します。

+(id) subsegmentWithState:(SubsegmentState)subegmentState { return... ]

-(id) initWithState:(SubsegmentState)theSubsegmentState {
    subegmentSpriteBatch = [CCSpriteBatchNode batchNodeWithFile:@"txt.png"];
    [self addChild:subegmentSpriteBatch];
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"txt.plist"];

    self = [super initWithSpriteFrameName:theSubegmentStateFrameName];
    if (self){

    } 
    return self;

1 つのバッチ ノードを CCNodeSUbclass に追加してから、セグメントのインスタンスを子として batchnode に追加しようとしましたが、これはエラーをスローします。また、CCNodesubclass バッチノードに子 (サブセグメント) を追加する方法もわかりません。

ちなみに、これで明らかになったインスタンスメソッドコードではなくクラスの使用は臭いですか?

4

1 に答える 1

1

セグメントの各インスタンスは、他のすべてのセグメントとは異なる batchNode を作成し、同様に、subSegment のすべてのインスタンスは、他のすべてのサブセグメントとは異なる batchNode を作成します。したがって、バッチ処理はまったく行われておらず、多数のドローコールが説明されています。

おそらく、これら 2 つのクラスの外部でバッチノードを初期化し、それをセグメントとサブセグメントの両方の ctor に渡すことができます。また、スプライトフレーム キャッシュを .plist で 1 回だけシードします (途中でスプライトフレームを削除しない限り)。

于 2013-07-25T03:01:26.087 に答える