我有一个使用[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中的精灵帧。当使用从纹理图集加载的精灵时,每个精灵的纹理等于精灵图纸的纹理。有没有办法解决这个问题,还是我必须删除并重新创建精灵?如果这是我唯一的选择,有没有办法从其父节点中删除ccnode但保留其子节点?
答案 0 :(得分:17)
当你有一个带有精灵框架的纹理时,你不想改变纹理,而是改变精灵使用的精灵框架。你可以这样做:
CCSpriteFrameCache* cache = [CCSpriteFrameCache sharedSpriteFrameCache];
CCSpriteFrame* frame = [cache spriteFrameByName:name];
sprite.displayFrame = frame;
在cocos2d v3中,它需要是:
sprite.spriteFrame = frame;
答案 1 :(得分:3)
要将CCSprite的图像更改为动画,每帧之间有1秒的时间:
CCSpriteFrameCache *cache = [CCSpriteFrameCache sharedSpriteFrameCache];
CCSpriteFrame *frame1 = [cache spriteFrameByName:[NSString stringWithFormat:@"plist_file_key_here1.png"]];
CCSpriteFrame *frame2 = [cache spriteFrameByName:[NSString stringWithFormat:@"plist_file_key_here2.png"]];
NSArray *animFrames = [NSArray arrayWithObjects:frame1, frame2, nil];
CCAnimation *animation = [CCAnimation animationWithFrames:animFrames delay:1.0f];
[originalSprite runAction:[CCAnimate actionWithAnimation:animation restoreOriginalFrame:NO]];
答案 2 :(得分:0)
考虑一个名为mySprite的CCSprite对象。现在您可以按如下方式更改精灵的图像:
[mySprite setTexture:[[CCTextureCache sharedTextureCache] addImage:[Tools imageNameForName:"myNewImage.png"]]];
这会将CCSprite对象mySprite的图像更改为myNewImage.png
注意:如果要更改的图像位于资源的任何特定文件夹中,则可以使用图像的整个路径评估该图像。