渲染 CCSprite 纹理会给出旧图像

Posted

技术标签:

【中文标题】渲染 CCSprite 纹理会给出旧图像【英文标题】:Rendering CCSprite texture gives the old images 【发布时间】:2013-11-25 14:11:17 【问题描述】:

我有一个带有 UIImagePicker 的场景。从库中选择图像将呈现一个带有所选图像的新场景。呈现一个新场景后,我使用以下方法显示从 onEnter 方法调用的图像以及从库中选择的图像。

-(void) loadPuzzleImage:(UIImage*)selectedImageFromLibrary 

    puzzleImage = [[CCSprite alloc] initWithCGImage:[selectedImageFromLibrary CGImage] key:@"selectedimage"];
    puzzleImage.anchorPoint = ccp(0,0);
    puzzleImage.opacity = 80.0f;
    puzzleImage.position = ccp(screenSize.width - puzzleImage.contentSize.width - 136,
                                   screenSize.height - puzzleImage.contentSize.height - 48);

    [self addChild: puzzleImage z:1 tag:10];
    [puzzleImage release];

当我返回并从库中选择新图像时,它只显示以前的图像。我通过在 CCSprite 分配中为 CGIImage 使用不同的键来解决它。但是当我使用渲染纹理来获取 CCSprite 图像时,它只返回前一个图像而不是当前图像。我不知道为什么。我使用以下代码来渲染图像。

-(UIImage *) convertSpriteToImage:(CCSprite *)sprite 

    CGPoint p = sprite.anchorPoint;
    [sprite setAnchorPoint:ccp(0,0)];
    CCRenderTexture *renderer = [[CCRenderTexture alloc] initWithWidth:sprite.contentSize.width 
                                                                height:sprite.contentSize.height 
                                                           pixelFormat:kCCTexture2DPixelFormat_RGBA8888];
    [renderer begin];
    [sprite visit];
    [renderer end];
    [sprite setAnchorPoint:p];
    return [renderer getUIImage];

并通过

调用此方法
UIImage* tempPuzzle = [self convertSpriteToImage:
                           [CCSprite spriteWithTexture:[puzzleImage texture]]];

任何帮助将不胜感激。

【问题讨论】:

我认为你被 textureCache 愚弄了。您可能想要更改每个 selectedImage 的键。否则,下次使用 CCSprite ctor 时,ctor 将首先在缓存中查找键并返回该纹理。 是的。旧图像保存在纹理缓存中。我使用 removeTextureForKey 方法删除了缓存的图像。谢谢@YvesLeBorg。 【参考方案1】:

使用“可丢弃”纹理创建精灵后,您应该立即将带有图像名称的removeTextureForKey: 消息发送到CCTextureCache。这应该足以在您下次创建具有相同图像名称的精灵时使用相同的键重新加载纹理。

【讨论】:

谢谢史蒂芬。我通过使用 removeTextureForKey 方法解决了这个问题。

以上是关于渲染 CCSprite 纹理会给出旧图像的主要内容,如果未能解决你的问题,请参考以下文章

将视口渲染到纹理会产生重叠视口吗?

为啥从 FBO 解除绑定纹理会清除纹理?

使用camera.unproject重新渲染纹理会在相机移动时设置错误的位置

探究光栅图像学之水纹渲染与折射滤镜

OpenGL:加载纹理会改变当前颜色

OpenGL:如果我将新的纹理绑定到另一个目标,纹理会发生啥?