在Cocos2D iOS中预加载动画

时间:2013-09-20 12:33:54

标签: ios caching animation cocos2d-iphone preloading

我面临游戏问题我正在开发。我有几个动画,我的问题是,它们正常工作,但第一次加载,有一个延迟,只是第一次。我不知道如何解决它。我已阅读有关CCAnimationCache的所有文档,我已阅读论坛,但我没有成功。我仍然有同样的问题,动画工作,但第一次加载其中一个,有一个延迟。你能帮帮我吗?我也读过这个网站:http://www.johnwordsworth.com/2011/07/loading-cocos2d-sprite-frame-animations-from-plist-files/他们谈论预加载但我的结果是一样的。

我在开头缓存动画,看起来它们都在缓存中,但结果不是所有的时间,每次我第一次加载其中一个动画时都会出现这种延迟。

我编写了一个函数来预加载规范之后的所有动画并使用CCAnimationCache,它不起作用或者我错了。以下是我制作的一些代码:

for(int element = 0; element < 3; element++){
        for(int pos = 0; pos < 3; pos++){
 CCAnimation *auxAnimation = nil;

            animation =  getAnimationInformationWithElement(element, pos);
            [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:[NSString stringWithFormat:@"%@.plist",animation.animationFileHeader]];
            for(int i = 0; i <= animation.numberOfFrames; i++) {
                if(i<=9)auxFileName = [animation.animationPNGFileName stringByAppendingString:@"0000"];
                else auxFileName = [animation.animationPNGFileName stringByAppendingString:@"000"];
                [elementsAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"%@%d.png",auxFileName,i]]];
            }

            auxAnimation = [CCAnimation elementsAnimFrames];

            [animationsToBeSaved elementsAnimFrames];
            elementsAnimFrames = [[[NSMutableArray alloc] init] autorelease];

            [[CCAnimationCache sharedAnimationCache] addAnimation:auxAnimation name:[NSString stringWithFormat:@"animation_%d_%d",element,pos]];
        }
    }

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

假设您的动画是.png Spritesheets,我建议您将图像异步预加载到缓存中。

/ **异步,从文件加载texture2d。  *如果先前已加载文件图像,则会使用它。  *否则它将在新线程中加载纹理,并且在加载图像时,将调用该块。  *回调将在cocos2d线程中调用,因此从回调中创建任何cocos2d对象是安全的。  *支持的图像扩展名:.png,.bmp,.tiff,.jpeg,.pvr,.gif  * @since v2.0  * /

-(void) addImageAsync:(NSString*) filename withBlock:(void(^)(CCTexture2D *tex))block;

例如,按如下方式使用它:

[[CCTextureCache sharedTextureCache] addImageAsync:@"spritesheetName.png" withBlock:^(CCTexture2D *texture){
        @synchronized(self){
            if (texture)
                //increment preloaded assets count or whatever..
        }
    }];