Cocos2d iphone Cocos2d';s CCSpriteBatchNode抱怨不同的纹理ID

Cocos2d iphone Cocos2d';s CCSpriteBatchNode抱怨不同的纹理ID,cocos2d-iphone,Cocos2d Iphone,我正在尝试使用CCSpriteBatchNode一次渲染多个精灵来优化我的游戏。但是,由于某种原因,当我将CCSpriteBatchNode作为我的精灵的父级引入时,cocos2d给了我这个错误: "CCSprite is not using the same texture id" 我对此感到困惑,因为我有一个1024x1024纹理图集和我所有的图形。它是用TexturePacker创建的,没有批处理节点,一切正常。我一直在加载以下内容: [[CCSpriteFrameCache share

我正在尝试使用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 texture init/lookup代码中,令人惊讶的是,有一些纹理是用不同的维度创建的(例如256x256甚至更小)。当我只有一个1024x102PNG作为输入时,我不明白怎么会发生这种情况

发生了什么事?我如何调试这个

更新:


邦吉的回答帮助我解决了这个问题——让我对每件事都看了两遍。在我的iOS模拟器中,有一些旧版本游戏的过时PNG文件正在加载,尽管它们不再在Xcode项目中。从Xcode执行“清理”甚至“清理构建文件夹”都不起作用,但使用iOS模拟器中的“重置内容和设置”命令就成功了。万岁

如果游戏中有多个精灵表,请确保它们不共享和帧名,另一个解决方法是手动指定纹理id

将上述代码替换为:

CCSprite* sprite = [CCSprite spriteWithSpriteFrameName:@"something.png"];
CCSpriteBatchNode* bar = [CCSpriteBatchNode batchNodeWithFile:@"atlas1.png"];
[sprite setTexture:[bar texture]];
[bar addChild: sprite]; // assert error here

我发现的另一件事是,如果您的游戏在应用程序委托中收到内存警告,则有时会清除texturecache,您可以对此进行注释,但请注意在可能的情况下清除缓存。

强制执行纹理id可以避免断言失败。现在屏幕上显示的是正确的atlas1.png表中的内容,但纹理坐标不正确。因此,正如我前面所说,您必须有多个精灵表,每个精灵表的框架名称必须是单独的。如果使用texturepacker或zwoptex创建精灵表,只需确保添加到其中的小png文件不共享相同的文件名。最简单的方法是给它们加上前缀,例如敌人-01_idle.png和玩家-01_idle.png(对于最初称为01_idle.png的图像)和两张名为敌人和玩家的表格