2012-06-09 34 views
1

我不知道这是否可行,但我想创建一个大纹理地图集并将其用于所有类的应用程序。Cocos2D 2.0 - 一个CCSpriteBatchNode可以用于多个类吗?

一个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更换这两个精灵及其他:...

感谢

回答

5

我不完全相信我跟随,但我敢肯定的答案是肯定的。

CCSpriteBatchNode与类没有任何关系,它与资产有关。使用批处理节点的一个重要限制是批处理中的每个精灵都需要引用相同的纹理地图集。因此,为整个应用程序提供一个批处理节点并让每个游戏玩法类都将其自己的精灵添加到该批处理中是完全正确的。如果您的纹理图集大于目标硬件上的最大纹理大小(请参阅iOS设备规格了解详细信息),但这会变成实际问题,但如果您仍想拥有全局批次和大量资产,则创建起来并不难按纹理ID索引的批处理池,为每个图集创建一个批处理节点,并且每当您创建新的sprite时,都将其添加到适当的批处理中。老实说,我觉得整个批处理节点的事情对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 
} 
` 

所以,当你初始化其他类之一,您通过主类实例作为参数,以便您可以访问它的字段。或者让主/经理类成为单身人士或找到适合您需求的另一种体系结构。

+0

谢谢,但假设您的主类有一个名为self.batchNodeGeneral的属性,并且会返回该属性的方法,您将如何重写我在init部分发布的代码以使用该主类自身的纹理。 batchNodeGeneral属性? – SpaceDog

+0

那么这对你来说更像是一个架构决定。你可以将你的主要对象变成像负责该批处理的游戏管理器一样,并使其成为单例,这对于特别是Cocos2D和iOS开发来说似乎是超流行的选择。或者您可以让其他游戏类在初始化时将主类作为参数,以便他们可以访问它。取决于你的想法以及你要做什么,像这样的建筑事物会变得非常虔诚。 – Suboptimus

+0

好吧,但我的主要观点是这样的:在主类我有这一行[self addChild:self.batchNodeGeneral]; ...在一个类的init部分如何可以有另一个这些行添加相同的节点再次去那个班?听起来不对,如果我尝试它会崩溃。 – SpaceDog

相关问题