Cocos2d的CCSpriteBatchNode抱怨不同的纹理ID

4

我试图使用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

我尝试向cocos2d纹理初始化/查找代码添加一些NSLog调试输出,令人惊讶的是,有一些纹理被创建为不同的尺寸(例如256x256甚至更小)。我不明白在仅有单个1024x1024 png作为输入时如何发生这种情况。

发生了什么?我该如何进行调试?

更新:

Bongeh的答案帮助我解决了问题-使我仔细检查了一遍所有内容。我的iOS模拟器中还存在一些旧版本游戏的过期PNG文件正在加载,即使它们不再在Xcode项目中。从Xcode执行“清除”甚至“清除构建文件夹”都没有效果,但使用iOS模拟器的“重置内容和设置”命令就可以解决问题。好极了!

1个回答

8

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

请使用以下代码替换上面的代码:

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

我发现的另一件事是,如果你的游戏在应用程序委托中收到内存警告,有时纹理缓存会被清除。你可以将其注释掉,但请注意在可能的情况下清除缓存。


强制执行纹理ID消除了断言失败。现在屏幕上显示的是来自正确的atlas1.png表的内容,但纹理坐标不正确。 - Tomas Andrle
1
正如我之前所说,你必须有多个精灵表,每个精灵表的帧名称都需要是唯一的。如果你正在使用texturepacker或zwoptex创建精灵表,只需确保你添加进去的小png文件没有共享相同的文件名。最简单的方法是给它们加前缀,比如enemy-01_idle.png和player-01_idle.png(对于一个最初被称为01_idle.png的图像)以及分别为enemy和player的两张表。 - Bongeh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接