Cocos2D 2.0 - 一个CCSpriteBatchNode可以用于多个类吗?

时间:2012-06-09 18:53:19

标签: cocos2d-iphone

我不知道这是否可行,但我想创建一个大的纹理图集并在应用程序的所有类上使用它。

一个CCSpriteBatchNode可以用于多个类吗?

假设我在主类

上创建了这个
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"atlasGeral.plist"];
self.batchNodeGeneral = [CCSpriteBatchNode batchNodeWithFile:@"atlasGeral.png"];
[self addChild:self.batchNodeGeneral];

我有另一个在主类上创建CCLayers的类,在使用CCSpriteBatchNode之前已初始化,如下所示:

-(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进行优化吗?我的想法是用 [CCSprite spriteWithSpriteFrameName:...

替换这两个精灵和其他精灵

感谢

1 个答案:

答案 0 :(得分:5)

我不完全确定我会关注,但我很确定答案是肯定的。

CCSpriteBatchNode与类没有任何关系,它与资产有关。批处理节点使用的重要限制是批处理中的每个sprite都需要引用相同的纹理图集。因此,为整个应用程序创建一个批处理节点并让每个游戏类都将自己的精灵添加到该批处理中是完全正常的。如果您的纹理图集大于目标硬件上的最大纹理大小,则可能会变成实际问题(有关详细信息,请参阅iOS设备规范),但如果您仍想拥有全局批量和大量资源,则创建起来并不难由纹理ID索引的批处理池,每个地图集创建一个批处理节点,每当您创建新的精灵时,将其添加到相应的批处理中。

老实说,我觉得整个批处理节点的事情是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
}
`

因此,当您初始化其他类之一时,将主类实例作为参数传递,以便可以访问其字段。或者使main / manager类成为单例或找到适合您需求的另一种架构。