我正在尝试使用CCSpriteBatchNode优化我的游戏,一次渲染多个精灵。但是,由于某种原因,当我引入CCSpriteBatchNode作为我的精灵的父级时,cocos2d给了我这个错误:
"CCSprite is not using the same texture id"
我对此感到困惑,因为我的所有图形都有一个1024x1024纹理图集。它是使用TexturePacker创建的,没有批处理节点,一切正常。我一直在加载它:
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"atlas1.plist"];
现在我正试图像这样使用CCSpriteBatchNode:
CCSprite* sprite = [CCSprite spriteWithSpriteFrameName:@"something.png"];
CCSpriteBatchNode* bar = [CCSpriteBatchNode batchNodeWithFile:@"atlas1.png"];
[bar addChild: sprite]; // assert error here
我尝试将一些NSLog调试输出添加到cocos2d纹理初始化/查找代码中,并且令人惊讶的是,有一些纹理被创建为具有不同的维度(例如256x256甚至更小)。我不明白当我只有一个1024x1024 png作为输入时会发生什么。
发生了什么事?我该怎么调试呢?
更新
Bongeh的回答帮助我解决了这个问题 - 让我看了两遍。我的iOS模拟器中有一些旧版本的PNG文件被加载,即使它们不在Xcode项目中也是如此。从Xcode执行“清理”甚至“清理构建文件夹”不起作用,但使用iOS模拟器中的“重置内容和设置”命令就可以了。万岁!
答案 0 :(得分:8)
如果你的游戏中有超过1个spritesheet,请确保它们不共享和帧名称,另一个解决方法是手动指定纹理ID。
将以上代码替换为:
CCSprite* sprite = [CCSprite spriteWithSpriteFrameName:@"something.png"];
CCSpriteBatchNode* bar = [CCSpriteBatchNode batchNodeWithFile:@"atlas1.png"];
[sprite setTexture:[bar texture]];
[bar addChild: sprite]; // assert error here
我发现的唯一另一件事是,如果你的游戏在应用程序代理中收到内存警告,纹理缓存会被清除,你可以将其注释掉,但只要注意清除缓存就可以了。