2

プログレスバーを使用して音楽、画像、その他のものをシーンにロードし、バーをスムーズに移動する方法..プログレスバーのロジックは、新しいスレッドを作成することだと思います-データをロードしてスレッドを破棄します、進行状況バーは表示されますが、値は更新されません

-(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;
}
4

1 に答える 1

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 PerformSelector:@selector(s1)]の代わりに[self s1]を使用することもできます。これは、これらが同一であるためです。それが役立つことを願っています

于 2013-01-16T15:22:27.123 に答える