【问题标题】:Error loading CCZ compressed file for iPhone5 images为 iPhone5 图像加载 CCZ 压缩文件时出错
【发布时间】:2025-12-07 09:45:01
【问题描述】:

使用 Texture Packer,我将 iPhone5 背景图像放在 pvr.ccz 文件中,并将输出文件保存在我的 cocos2d 项目的 Resources 文件夹中。当我尝试加载 pvr.ccz 文件时,出现以下一系列错误:

cocos2d: Filename(StoreMenuBackground_iPhone5-hd.pvr.ccz) contains -hd suffix.
cocos2d: CCFileUtils: Warning HD file not found: StoreMenuBackground_iPhone5-hd.pvr.ccz
cocos2d: Error loading CCZ compressed file

然后代码在一个名为 ccInflateCCZFile 的方法中以 EXC_BAD_ACCESS 崩溃(在 cocos2D 文件 ZipUtils.m 中)。我正在执行的代码行是:

backgroundBgNode = [CCSpriteBatchNode batchNodeWithFile:@"StoreMenuBackground_iPhone5-hd.pvr.ccz"];

现在奇怪的是,如果我在 Texture Packer 中重新创建 pvr.ccz 文件而不在我尝试加载的 pvr.ccz 或背景 png 图像上添加 -hd 扩展名,然后放置生成的输出文件在 Resources 文件夹中并重新运行代码,则未检测到错误。如果我然后从 Resources 文件夹中删除此 pvr.ccz 和关联的 .plist 文件(没有 -hd 扩展名的文件),一切都很好。持怀疑态度,然后我进行了清理和新构建,它仍然有效。

为什么我一开始就收到这个错误?当我执行上述步骤时,为什么它会消失。我可以相信最终结果是有效的吗?

我使用的是 Cocos2d V1.0。我已经在多个背景图像上尝试过这个,它们的行为都一样。对于 iPad 或 iPad-hd,我也没有这个问题。

【问题讨论】:

    标签: ios cocos2d-iphone iphone-5 texturepacker


    【解决方案1】:

    因为 cocos2d 在 Retina 设备上会自动搜索 -hd 后缀的文件。您不应该直接使用带有任何 -hd/-ipad#/-ipadhd/-wide/-widehd 后缀的文件名。

    您可以使用 CCFileUtils 调整后缀映射,尽管这在 cocos2d-iphone v1.0 中非常有限。

    【讨论】:

    • 澄清一下,你是说我不应该在 .png 文件上使用 -hd 后缀,还是说我不应该在 .png 文件上使用 -hd 后缀。 pvr.ccz 文件是什么?如果我不在其中任何一个上使用它,那么它也不起作用。您指的是后缀映射的什么调整?据我所知,Cocos2d V1 不具备 [sharedFileUtils setiPadSuffix:@"-ipad"]; 的能力。还有其他方法吗?
    • 在加载文件时,不应通过传递类似 @"StoreMenuBackground_iPhone5-hd.pvr.ccz" 的字符串来引用文件的后缀版本 - 而您只需使用文件的基本版本并让 cocos2d 决定它应该使用哪个(如果有)后缀版本:@"StoreMenuBackground_iPhone5.pvr.ccz" PS:也许你至少应该升级到 v1.1,因为这种问题听起来像是一个早期的开发问题,那么应该不会太麻烦(如果你可以使用 v2.1 就更好了)。 v1.0 缺乏适当的 iPad Retina 支持。
    • 我按照你的建议做了(即将我的代码更改为:backgroundBgNode = [CCSpriteBatchNode batchNodeWithFile:@"StoreMenuBackground_iPhone5.pvr.ccz"];),但我仍然收到我在问题陈述。具体来说,我得到:cocos2d:CCFileUtils:未找到警告高清文件:StoreMenuBackground_iPhone5-hd.pvr.ccz,我得到:cocos2d:加载CCZ压缩文件时出错。接下来是我在问题陈述中提到的 EXC_BAD_ACCESS。你能看到我做错了什么吗?与我所说的相反,我在其他设备上也看到了这一点。
    • 注意,进入ccInflateCCZFile时,路径不包含-hd后缀(我的Resource文件夹中不存在)。然后它调用 ccLoadFileIntoMemory。这将返回 filelen = -1。这会导致第二条错误消息并最终导致 EXC_BAD_ACCESS。
    • 纹理图集中的图像名称(又名精灵帧名称)不应有任何后缀,如 -hd。你会有 xxx.plist + xxx.png 和 HD xxx-hd.plist 和 xxx-hd.png 但在两个图集中,图像应该具有相同的名称,如 -hd 和非 - 中的“example.png”高清地图集。