2012-06-01 48 views
0

我有一個算法需要幾秒鐘來加載一些東西,我想先在標籤上設置字符串以在實際加載開始之前說「加載」。這全部在同一層,這不是在場景之間切換。使用Cocos2D scheduleUpdate來延遲加載

我想我可以簡單地這樣做:

-(void)startLoading{ 

[self unscheduleAllSelectors];//just in case the update is already scheduled 

[self.loadingLabel setString:@"Loading...."]; 

[self scheduleUpdate]; 

} 

然後,我有這樣的:

-(void)update:(ccTime)delta{ 
[self unscheduleUpdate]; 
[self beginLoading];//another method that loads all the stuff 

} 

我的理解是,我的方法不應該運行到下一幀。因此我的標籤應該正確更新。但是,這沒有發生。當我的所有資產都被加載並且我的標籤在加載開始之前永遠不會更新的時候,會有輕微的凍結。

我錯過了一個步驟嗎?

+0

你是從場景/圖層中的init函數調用startLoading嗎?此線程似乎有一個解決方案... http://www.cocos2d-iphone.org/forum/topic/15998 – badgerr

+0

該線程指的是一個不同的問題。我的更新正在運行,但它並未等待一幀,或者如果是這樣,先前的幀在新幀開始之前沒有完成,而我認爲這是不可能的。我不是從init方法調用。 – johnbakers

回答

0

不能錯過任何東西。我停止了與此戰鬥,現在使用這種'延遲'任務彈射器。它應該確保你會在從第一個到第二個tick的轉換中得到一個平局:

-(void) startLoading{ 
    _loadTicker=0; // an NSUInteger iVar declared in the .h 
    [self schedule:@selector(tickOffLoading:)]; 
} 

-(void) tickOffLoading:(ccTime) dt{ 

    _loadTicker++; 
    if(_loadTicker==1) { 
     [self.loadingLabel setString:@"Loading...."]; 
    } else { 
     [self unschedule:@selector(tickOffLoading:)]; 
     [self beginLoading]; 
    } 
} 
+0

謝謝,你和我有類似的想法。我結束了仍然使用常規'更新'方法,但也使用幀計數器ivar – johnbakers

+0

@andrewx:lol,並不真正感到驚訝,類似的問題會產生類似的解決方案。這可以很好地爲後臺任務加載階段,因爲您可以將滾動條檢查級聯到1,2,3等... – YvesLeBorg

+0

我仍然想知道爲什麼它不像預期的那樣工作。我猜更新必須在初始計劃時運行在相同的「幀」或運行循環。 – johnbakers