Cocos2d如何创建进度条(加载场景)

时间:2013-01-16 14:25:51

标签: objective-c cocos2d-iphone nsthread

如何按顺序将音乐,图像和其他内容加载到进度条和移动条平滑的场景中... 我猜进度条的逻辑是创建新的线程 - 加载数据并销毁线程 这是我的代码加载东西,但它不起作用,进度条出现但没有更新值

-(void)s1
{
    [[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:@"game_music.caf"];
}

-(void)s2
{
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"tap.caf"];
}

-(void)startThread
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    EAGLContext *context = [[[EAGLContext alloc]
                               initWithAPI:kEAGLRenderingAPIOpenGLES1
                                sharegroup:[[[[CCDirector sharedDirector] openGLView] context] sharegroup]] autorelease];
    [EAGLContext setCurrentContext:context];

    [self performSelector:@selector(loadBar)];
    //[self schedule:@selector(tick:)];
    [self performSelector:@selector(s1)];                   // uploading file
    [self performSelector:@selector(progressUpdateValue)];  // add 10 value to progress
    [self performSelector:@selector(s2)];                   // uploading file
    [self performSelector:@selector(progressUpdateValue)];  // add 10 value to progress

    [self performSelector:@selector(replaceScene)
                 onThread:[[CCDirector sharedDirector] runningThread]
               withObject:nil
            waitUntilDone:false];
    [pool release];

}

-(void)replaceScene
{
    [[CCDirector sharedDirector]replaceScene:[GameScene node]];
}

-(id)init
{
    self = [super init];
    if (self != nil)
    {
        [NSThread detachNewThreadSelector:@selector(startThread) toTarget:self withObject:nil];
    }
    return self;
}

提前致谢。

界面..你去..)

@interface LoadScene : CCScene
{
    GPLoadingBar *loadingBar;
    float value;
}

1 个答案:

答案 0 :(得分:3)

好的,所以你应该在后台加载资源,同时在主线程中更新loadBar。对于SimpleAudioEngine,您确实需要NSThread,但CCTextureCashe具有-addImageAsync方法,允许您异步加载图像而不会出现问题。所以你的代码应该是这样的:

-(void)s1
{
    [[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:@"game_music.caf"];
}

-(void)s2
{
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"tap.caf"];
}

-(void)startThread
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    [self s1];
    loadingBar.value = 0.5;
    [self s2];

    [self performSelectorOnMainThread:@selector(replaceScene)
                 withObject:nil
            waitUntilDone:false];
    [pool release];

}

-(void)replaceScene
{
    [[CCDirector sharedDirector]replaceScene:[GameScene node]];
}

-(id)init
{
    self = [super init];
    if (self != nil)
    {
        [self loadBar];
        [NSThread detachNewThreadSelector:@selector(startThread) toTarget:self withObject:nil];
    }
    return self;
}

-(void) loadingFinished
{
    [self replaceScene];
}

Cocos2d有自己的更新循环,因此您无需创建用于更新loadingBar的循环。它还有一个绘图循环,所以如果你想在屏幕上动态更新某些内容,你应该只设置更新值而不是用加载资源来停止主线程

另外,您可以使用[self s1]而不是[self performSelector:@selector(s1)],因为它们是相同的。希望这会有所帮助