CCSprite:批量精灵应该使用与batchnode相同的纹理?

时间:2012-09-09 04:17:35

标签: ios cocos2d-iphone crash nodes ccsprite

我一直在说崩溃:*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'CCSprite: Batched sprites should use the same texture as the batchnode'

我不太清楚这意味着什么。我用谷歌搜索了崩溃但没有结果。这也只有在我从游戏中的第二个场景回来后回到我的第一个场景时才会发生。

我仔细检查了我的代码,并确保我的精灵表中的所有图像都作为子项添加到批处理节点。我还确保我的应用程序中不在我的精灵表中的图像作为子项添加到我的图层而不是批处理节点。

无论如何导致此次崩溃的原因以及如何解决?

谢谢!

Edit1 :我的应用中似乎发生在这一行:

[self.spriteLeft setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:imageName]];

我NSLog imageName并返回:MyImage.png,然后我查看我的plist和pvr.ccz,我加载并且MyImage.png 肯定在那里。所以当一切看起来都正确时,我不知道它为什么会崩溃。另外,我确保在我加载精灵表中的图像的地方不使用spriteWithFile。

1 个答案:

答案 0 :(得分:2)

它只是意味着它所说的:当你用纹理创建CCSpriteBatchNode对象对象时,稍后当你向CCSpriteBatchNode添加精灵时,你添加到CCSpriteBatchNode的所有精灵必须来自相同的纹理。例如:

NSString *spriteName = @"agility"; // an example, this code comes from a method that returns the batchNode
                                   // for many status types

NSString *plist = [NSString stringWithFormat:@"status_%@.plist",spriteName];
NSString *textureFileName = [NSString stringWithFormat:@"status_%@.pvr.gz",spriteName];
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:plist textureFile:textureFileName];
CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithFile:textureFileName];

//  plist has a frame named status_agility_Ok.png

CCSprite *frameStatusOk = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"status_%@_Ok.png",spriteName]];  
[batchNode addChild:frameStatusOk]; // this will work, both the sprite and the batch node have the same texture

CCSprite *frameStatusNotOk=[CCSprite spriteWithFile:@"someOtherTextureFile.pvr.gz"];
[batchNode addChild:frameStatusNotOk]; // this will fail an assertion and crash.