我有一个使用[CCSprite spriteWithSpriteFrameName:@"plist_file_key_here.png"]初始化的CCSprite。我已经将我的plist文件中的所有 Sprite 添加到CCSpriteFrameCache中。我尝试过像这样设置纹理:

CCSpriteFrame * frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:name];
NSAssert(frame.texture!=nil, @"frame.texture can't equal nil"); //this works fine
[sprite setTexture:frame.texture]; //doesn't cause a white square to appear, just doesn't switch the image.

正如我在评论中所说,这是行不通的。我认为这与使用[CCSprite spriteWithFile:][CCSprite spriteWithSpriteFrameName:]之间的区别有关,后者依赖于从纹理图集加载到CCSpriteFrameCache中的子画面帧。使用从纹理图集加载的 Sprite 时,每个 Sprite 的纹理都等于 Sprite 表的纹理。有什么办法解决还是我必须删除并重新创建 Sprite ?如果那是我唯一的选择,是否有办法从其父级删除ccnode但保留其子级?

最佳答案

The API Reference to rescue!

当您具有带有sprite框架的纹理时,您不想更改纹理,而是要更改sprite使用的sprite框架。您可以执行以下操作:

CCSpriteFrameCache* cache = [CCSpriteFrameCache sharedSpriteFrameCache];
CCSpriteFrame* frame = [cache spriteFrameByName:name];
sprite.displayFrame = frame;

在cocos2d v3中,它必须为:
sprite.spriteFrame = frame;

10-07 19:54