对CCSprite进行子类化并使用CCSpriteBatchNode

时间:2013-07-25 02:46:24

标签: objective-c cocos2d-iphone kobold2d

我有一个子类CCNode,我添加了几个相同的小子类CCSprite WHICH IN TURN有几个子类精灵子。我以为我正在使用CCSpriteBatchNode,但我注意到数百个绘制调用正在注册,我认为这应该只有一个。

我的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;

我尝试将一个批处理节点添加到CCNodeSUbclass,然后将一个段的实例作为子节点添加到batchnode但是这会引发错误。我也不确定我是如何添加CCNodesubclass batchnode的子(子分段)。

顺便说一下,我是否使用了类而不是实例方法代码的味道,这一点已经曝光了吗?

1 个答案:

答案 0 :(得分:1)

每个段的实例都会从每个其他段创建不同的batchNode,类似地,每个subSegment实例都会从每个其他子段创建不同的batchNode。因此,您根本没有批处理,解释了大量的绘制调用。

也许你有可能在这两个类之外初始化batchnode,并将它传递给ctor's的segment和subSegment。我也只使用.plist为spriteframe缓存播种一次(只要你不沿途删除精灵帧)。

相关问题