1

我想在我的应用程序中实现启动加载器。应该是这样的:启动闪屏后,用户会看到简单的动画,同时app会预加载音效、背景音乐、精灵图片、精灵表等。当前实施:

- (id)init {
    if((self = [super init])) {

        // Some other setup ...
        CGRect rect;
        rect = waveSprite.textureRect;
        waveInitialTexRectOrigin = rect.origin;
        rect.size.width = 91;
        waveSprite.textureRect = rect;

        assetFilenames = [[NSArray alloc] initWithObjects:

                          // images
                          @"background.png",


                          // spritesheets
                          @"sprites.plist",

                          // fonts
                          @"main.png",

                          // sound effects
                          @"button.wav",
                          nil];
        assetCounter = 0;
        [self loadAsset];
    }
    return self;
}


- (void)update:(ccTime)dt {
    CGRect rect;
    rect = waveSprite.textureRect;
    rect.origin.x += dt*kLoaderWaveSpeed;
    while (rect.origin.x > waveInitialTexRectOrigin.x + kLoaderWavePeriod) {
        rect.origin.x -= kLoaderWavePeriod;
    }
    waveSprite.textureRect = rect;
}

#pragma mark Private

- (void)loadAsset {
//  CCLOG(@"loadAsset");

    NSString *filename = [assetFilenames objectAtIndex:assetCounter];
    CCLOG(@"loading %@", filename);

    NSString *ext = [filename pathExtension];

    if ([ext doesMatchRegStringExp:@"[png|jpg]"]) {
        [[CCTextureCache sharedTextureCache] addImage:filename];
    } else if ([ext isEqualToString:@"plist"]) {
        [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:filename];
    } else if ([ext doesMatchRegStringExp:@"[caf|wav|mp3]"]) {
        [[SimpleAudioEngine sharedEngine] preloadEffect:filename];
    }

    assetCounter++;

    if (assetCounter < [assetFilenames count]) {
        [self performSelector:@selector(loadAsset) withObject:self afterDelay:0.1f];
    } else {
        [self performSelector:@selector(loadingComplete) withObject:self afterDelay:0.2];

    }

但是动画太突然了。

UPD 我已经试过了

[self performSelectorInBackground: withObject:] 

但它似乎没有工作(挂在加载第一个资产)。也许我应该朝这个方向努力。

UPD2平滑 = 不突然,没有延迟和闪烁。fps没关系,20 fps还可以

4

3 回答 3

2

我没有使用 CC2D 的经验,但这是我在 ViewController 中用来显示平滑动画加载指示器的内容:

//Set up and run your loading scene/indicator here

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

        //Load your scene

    dispatch_async( dispatch_get_main_queue(), ^{

        //This fires when the loading is complete
        //Show menu and destroy the loader scene/indicator here

    });
});

我想这值得一试。

于 2012-07-20T13:03:21.633 回答
1

您不应该再使用 performSelectorInBackground,它没有被弃用,但可能很快就会出现,现在GCD出现在图片中。

我会尝试在主线程中运行动画,因为它是唯一可以进行 UI 更新的动画。并使用 GCD 生成一个或多个线程来加载所有资产。

我会使用并发调度队列来并行加载所有内容,并在完成后简单地关闭动画。

您可以在此处获取有关并发调度队列的完整信息:

并发编程指南

希望有帮助。

于 2012-07-20T13:03:10.643 回答
0

那是因为你在同一个线程上做所有事情。为加载程序使用单独的线程。

希望这可以帮助。

干杯!

编辑:看看这个

于 2012-07-11T11:58:15.053 回答